Entity Framework CoreEntity Framework Core入门


备注

实体框架(EF)Cor​​e是流行的实体框架数据访问技术的轻量级和可扩展版本。

EF Core是一种对象关系映射器(O / RM),它使.NET开发人员能够使用.NET对象使用数据库。它消除了开发人员通常需要编写的大多数数据访问代码的需要。

将包添加到项目中

要将EntityFrameworkCore添加到项目中,请更新project.json 文件(在dependenciestools 部分中添加新行):

"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"
}

不要忘记运行dotnet restore 来实际从互联网上下载这些软件包。

如果您使用的是Microsoft SQLServer以外的RDBMS - 请将Microsoft.EntityFrameworkCore.SqlServer 替换为正确的版本( Microsoft.EntityFrameworkCore.SqliteNpgsql.EntityFrameworkCore.PostgreSQL 或其他 - 请参阅您的RDBMS文档以获取推荐的软件包)。

具有类库和SQL Server的实体框架核心中的数据库优先

好吧,我花了大约一天的时间来弄明白所以我在这里发布了我所遵循的步骤,以使我的数据库首先在具有.NET核心Web应用程序的Class Project (.NET Core) 工作。

第1步 - 安装.NET Core

确保您使用的是.NET Core而不是DNX (Hint: You should be able to see the .NET Core option when creating a New Project) - 如果不是从这里下载

如果您在安装.NET Core时遇到问题(错误类似于未正确安装Visual Studio 2015 Update 3) - 您可以使用以下命令运行安装:[ DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1 ] -这将阻止安装执行Visual Studio检查Github问题

在此处输入图像描述

第2步 - 创建项目

创建一个新的ASP.NET核心Web应用程序 - >然后在下一个屏幕中选择Web应用程序

在此处输入图像描述

添加Class Library (.NET Core) 项目

在此处输入图像描述

第3步 - 安装EF包

打开类库的project.json 文件,粘贴以下内容,然后保存文件:

{
  "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-*"
        }
      }
    }
  }
}
 

这应该恢复References 下的包

在此处输入图像描述

- - - - - - - - 要么

您可以使用Nuget Package Manager通过在程序包管理器控制台中运行以下命令来安装它们

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools –Pre

Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
 

注意:一次安装一个包 - 如果安装后出错

Microsoft.EntityFrameworkCore.Tools
 

然后将project.json 框架部分的内容更改为:

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

第4步 - 创建数据库模型

现在要生成数据库,请在Package Manager Console 运行以下命令(不要忘记将连接字符串更改为数据库)

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

这将为您提供有关启动项目的错误:

在此处输入图像描述

为此,您必须将添加到类库中的相同引用添加到.NET Web App

所以打开你的project.json 用于Web App,

dependencies 项下,添加:

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

并在tools 下添加:

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

进行更改后保存文件。

这就是我的project.json的样子

在此处输入图像描述

然后再次在Package Manager Console中针对类库运行命令:

如果您尚未将类库的引用添加到Web App,则会收到以下错误:

在此处输入图像描述

要解决此问题,请将类库的引用添加到Web App:

在此处输入图像描述

最后

再次运行命令 - 在Package Manager Console

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

这应该在类库中的Models文件夹下创建实体

在此处输入图像描述

传递连接字符串

在我的例子中,我们有一个多租户应用程序,其中每个客户端都有自己的数据库,例如Client_1,Client_2,Client_3。所以连接字符串必须是动态的。

因此,我们将一个连接字符串属性添加到构造函数,并将其传递给OnConfiguring 方法中的Context

public partial class ClientContext
{
    private readonly string _connectionString;

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

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

并像这样使用它:

    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);
        }
    }
 

模型,查询和保存数据

模型

使用EF Core,可以使用模型执行数据访问。模型由实体类和派生上下文组成,表示与数据库的会话,允许您查询和保存数据。

您可以从现有数据库生成模型,手动编写模型以匹配数据库,或使用EF迁移从模型创建数据库(并随着模型的变化随时间变化而演变)。

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; }
    }
}
 

查询

使用语言集成查询(LINQ)从数据库中检索实体类的实例。

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

保存数据

使用实体类的实例在数据库中创建,删除和修改数据。

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

删除数据

使用语言集成查询(LINQ)从数据库中检索实体类的实例。

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

更新数据

使用实体类的实例在数据库中更新数据。

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();
}