Entity Framework CoreAan de slag met Entity Framework Core


Opmerkingen

Entity Framework (EF) Core is een lichtgewicht en uitbreidbare versie van de populaire Entity Framework-datatoegangstechnologie.

EF Core is een object-relationele mapper (O / RM) waarmee .NET-ontwikkelaars kunnen werken met een database met behulp van .NET-objecten. Het elimineert de noodzaak voor het grootste deel van de gegevenstoegangscode die ontwikkelaars meestal moeten schrijven.

Pakketten toevoegen aan het project

Om EntityFrameworkCore aan uw project toe te voegen, werkt u het project project.json (voegt nieuwe regels toe aan de secties dependencies en tools ):

"dependencies": {
    ...
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
    "Microsoft.EntityFrameworkCore.Design": {
      "version": "1.0.0",
      "type": "build"
    },
},
"tools": {
    ...
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
}

Vergeet niet dotnet restore te dotnet restore deze pakketten daadwerkelijk van internet te downloaden.

Als u een ander RDBMS dan Microsoft SQLServer gebruikt - vervang Microsoft.EntityFrameworkCore.SqlServer door de juiste versie ( Microsoft.EntityFrameworkCore.Sqlite , Npgsql.EntityFrameworkCore.PostgreSQL of andere - raadpleeg uw RDBMS-documentatie voor het aanbevolen pakket).

Database eerst in Entity Framework Core met een klassenbibliotheek en SQL Server

Oké, het kostte me ongeveer een dag om erachter te komen, dus hier post ik de stappen die ik heb gevolgd om mijn database eerst in een Class Project (.NET Core) , met een .NET Core Web-app.

Stap 1 - Installeer .NET Core

Zorg ervoor dat u .NET Core gebruikt en geen DNX (Hint: You should be able to see the .NET Core option when creating a New Project) - Indien NIET downloaden vanaf hier

Als u problemen hebt met het installeren van .NET Core (Fout is zoiets als Visual Studio 2015 Update 3 niet correct geïnstalleerd) - U kunt de installatie uitvoeren met de opdracht: [ DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1 ] - Dit voorkomt dat de installatie het Visual Studio Check Github-probleem uitvoert

voer hier de afbeeldingsbeschrijving in

Stap 2 - Maak de projecten

Maak een nieuwe ASP.NET Core-webtoepassing -> Selecteer vervolgens Webtoepassing in het volgende scherm

voer hier de afbeeldingsbeschrijving in

Voeg een Class Library (.NET Core) project Class Library (.NET Core)

voer hier de afbeeldingsbeschrijving in

Stap 3 - EF-pakketten installeren

Open uw project.json bestand van Class Library, plak het volgende en sla het bestand op:

{
  "version": "1.0.0-*",

  "dependencies": {
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    "NETStandard.Library": "1.6.0"
  },
  "tools": {
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "net46": {
    },
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0-*"
        }
      }
    }
  }
}
 

Dit zou de pakketten onder References moeten herstellen

voer hier de afbeeldingsbeschrijving in

---------------- OF

U kunt ze installeren met Nuget Package Manager door de volgende opdrachten uit te voeren in de Package Manager-console

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools –Pre

Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
 

Opmerking: installeer één pakket tegelijk - als u na de installatie een foutmelding krijgt

Microsoft.EntityFrameworkCore.Tools
 

Wijzig vervolgens de inhoud van uw sectie project.json frameworks in:

  "frameworks": {
    "net46": {
    },
    "netcoreapp1.0": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.0.0-*"
        }
      }
    }
  }
 

Stap 4 - Het databasemodel maken

Om de database te genereren, voert u de volgende opdracht uit in de Package Manager Console (vergeet niet de verbindingsreeks naar uw database te wijzigen)

Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer
 

Dit geeft je de foutmelding over het opstartproject:

voer hier de afbeeldingsbeschrijving in

Hiervoor moet u dezelfde referenties die u aan Class Library hebt toegevoegd, toevoegen aan de .NET Web App

Dus open je project.json voor de web-app,

Voeg onder dependencies toe:

"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
 

en onder tools toevoegen:

"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
 

Nadat u de wijzigingen hebt aangebracht, slaat u het bestand op.

Dit is hoe mijn project.json eruit ziet

voer hier de afbeeldingsbeschrijving in

Voer vervolgens de opdracht in Pakketbeheer-console opnieuw uit tegen de klassenbibliotheek:

Als je de referentie van je klassenbibliotheek nog niet aan de web-app hebt toegevoegd, krijg je deze foutmelding:

voer hier de afbeeldingsbeschrijving in

om dit op te lossen, voeg een referentie van uw klasbibliotheek toe aan uw web-app:

voer hier de afbeeldingsbeschrijving in

Tenslotte

Voer de opdracht opnieuw uit - in de Package Manager Console :

Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
 

Hiermee moeten de entiteiten onder de map Modellen in de klassenbibliotheek worden gemaakt

voer hier de afbeeldingsbeschrijving in

Een verbindingsreeks doorgeven

In mijn geval hebben we een Multi Tenant-toepassing, waarin elke client zijn eigen database heeft, bijvoorbeeld Client_1, Client_2, Client_3. Dus de verbindingsreeks moest dynamisch zijn.

Dus hebben we een verbindingstekeneigenschap toegevoegd aan een constructor en deze doorgegeven aan de context in de OnConfiguring methode

public partial class ClientContext
{
    private readonly string _connectionString;

    public ClientContext(string connectionString) : base()
    {
        _connectionString = connectionString;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(_connectionString);
    }
}
 

en gebruikte het zo:

    public void TestConnection()
    {
        var clientId = 1;

        var connectionString = string.Format("Server=192.168.0.211; Database=Client_{0}; user id= USER; password = PWD;", clientId);

        using (var clientContext = new ClientContext(connectionString))
        {
            var assets = clientContext.Users.Where(s => s.UserId == 1);
        }
    }
 

Gegevens modelleren, opvragen en opslaan

Model

Met EF Core wordt gegevenstoegang uitgevoerd met behulp van een model. Een model bestaat uit entiteitsklassen en een afgeleide context die een sessie met de database vertegenwoordigt, waarmee u gegevens kunt opvragen en opslaan.

U kunt een model genereren uit een bestaande database, een model handmatig coderen om bij uw database te passen of EF Migrations gebruiken om een database van uw model te maken (en deze te evolueren naarmate uw model in de loop van de tijd verandert).

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace Intro
{
    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;");
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }

        public List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
}
 

bevraging

Instanties van uw entiteitsklassen worden uit de database opgehaald met behulp van Language Integrated Query (LINQ).

using (var db = new BloggingContext())
{
    var blogs = db.Blogs
        .Where(b => b.Rating > 3)
        .OrderBy(b => b.Url)
        .ToList();
}
 

Gegevens opslaan

Gegevens worden gemaakt, verwijderd en gewijzigd in de database met behulp van instanties van uw entiteitsklassen.

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Add(blog);
    db.SaveChanges();
}
 

Gegevens verwijderen

Instanties van uw entiteitsklassen worden uit de database opgehaald met behulp van Language Integrated Query (LINQ).

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    db.Blogs.Attach(blog);
    db.Blogs.Remove(blog);
    db.SaveChanges();
}
 

Gegevens bijwerken

Gegevens worden bijgewerkt in de database met behulp van instanties van uw entiteitsklassen.

using (var db = new BloggingContext())
{
    var blog = new Blog { Url = "http://sample.com" };
    var entity = db.Blogs.Find(blog);
    entity.Url = "http://sample2.com";
    db.SaveChanges();
}