Entity Framework 从现有数据库创建核心模型

Entity Framework Core creating model from existing database

使用 Entity Framework Core,如何生成 EF 模型和实体?

根据 ASP.NET Core - Existing Database Microsoft 文章,您需要 运行 在程序包管理器控制台中执行如下命令:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

这让您可以零控制要导入的表或视图。这是否可能是现在使用 EF Core 对数据库进行逆向工程并创建 EF 模型和实体的唯一方法,与多年来使用完整 Entity Framework 完成的方法相比,这种方法有何进展?

在 Entity Framework Core 中无法做到这一点。 在此处阅读文档: https://docs.microsoft.com/en-us/ef/efcore-and-ef6/features

我的情况是我有一个 .net 4.5+ class 库,里面有 DbContexts。

这些 DbContext 是使用 "Code First from existing Database" 向导从现有数据库创建的。 EF Core 中似乎缺少此向导。

要从与 EF Core 兼容的现有数据库创建新的 Code First DbContext,我大致遵循了指南 here

我的步数:

  • 创建了一个新的核心Class库

  • 添加了 nuget 包 Microsoft.EntityFrameworkCore

  • 添加了 nuget 包 Microsoft.EntityFrameworkCore.Tools
  • 添加了 nuget 包 Microsoft.EntityFrameworkCore.SqlServer
  • 添加了 nuget 包 Microsoft.EntityFrameworkCore.SqlServer.Design

  • 打开了 nuget 包管理器控制台

  • 进入了command

    Scaffold-DbContext "data source=MYSQLDBSERVER\MYSQLINSTANCE;initial catalog=MYDB;integrated security=True;MultipleActiveResultSets=True;"
    
  • 作为提供商输入

    Microsoft.EntityFrameworkCore.SqlServer
    

请注意,使用非核心项目时,您可能 运行 遇到 nuget 程序包管理器控制台的问题。我通过创建一个新的核心 Class 库而不是 .net 库来避免这个问题。

创建上下文后,您可以像在 Code First 中一样正常编辑它,例如您可以删除不想使用的表。

我知道这个问题有点老了,但我认为它对遇到同样问题的人非常有用。

如果我没有正确理解你的问题,你想指定应该生成哪些表。 如果在命令中添加 -Tables 参数应该是可以的。

这是我用来生成 3 个数据库表的命令(在包管理器控制台中):

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=DatabaseName;Trusted_Connection=True;"  
     -Provider Microsoft.EntityFrameworkCore.SqlServer 
     -OutputDir Models -Context NorthwndContext 
     -Tables Products,Categories,Suppliers -Force

如您所见,我使用 Northwnd-Database 并且只生成表 "Products, Categories and Suppliers"。显然,你可以添加更多的表,你只需要用逗号分隔它们。

如果您不知道,您可以通过转到数据连接(服务器资源管理器)获取数据库名称,单击要添加的数据库,然后在右侧(属性),您会看到 属性(姓名)。对我来说是 "NORTHWND.MDF".

我使用 -Force 覆盖了我已经创建的任何模型。

您可以使用 -DataAnnotations 获取带注释的模型。否则,您将获得 Fluent 模型配置。

PS:我只在 ASP.NET Core 2 和 Entity Framework Core 2.0.0 上尝试过。

也可以套用骗子的方法:打开VS2015,新建class与实际项目同名的lib,然后运行实体数据模型向导

完成后,复制并粘贴到您的 .net 核心项目中。生成的代码需要进行一些调整,但这很简单。

但是,运行使用上面的脚手架命令是更好的解决方案。

想要使用 dotnet core 将 Sql 数据库架构转换为 EF core 的用户请按照以下步骤操作:

运行 所有命令一个接一个(对于那些想要创建新项目的人的第一个命令,否则你可以忽略它,只是 运行 项目根文件夹中的其他给定命令)

dotnet new mvc -o <ProjectName>

dotnet add package Microsoft.EntityFrameworkCore.SqlServer

dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design

dotnet add package Microsoft.EntityFrameworkCore.SqlServer.Design

dotnet add package Microsoft.EntityFrameworkCore.Tools

dotnet tool install --global dotnet-aspnet-codegenerator

终于...

dotnet ef dbcontext scaffold "Server=servername\instancename;Database=My_Database;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

这将在项目的模型文件夹中创建必要的模型和数据库模式的上下文。

现在您可以通过应用以下命令轻松生成 CRUD 代码:

dotnet aspnet-codegenerator controller -name <MyNewController> -m <ModelName> -dc <MyDbContext> --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries 

MyNewController 更改为您想要的控制器名称,将 ModelName 更改为您要定位的模型文件夹中的模型名称,最后MyDbContext 系统生成的上下文文件名在 Models 文件夹中可用

但在 运行 该命令之前,请确保您已在 appsettings.jsonstartup.cs 中进行了必要的更改 项目文件夹中的文件

appsettings.json行后添加

"AllowedHosts": "*",

 "ConnectionStrings": {
    "MyDbConnection": "Server=servername\instancename;Database=My_Database;Trusted_Connection=True;"
  }

startup.cs 文件在行

之前添加

services.AddMvc().SetCompatibilityVersion(兼容性版本.Version_2_2);

services.AddDbContext<SwiftRbs_LocalContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("MyDbConnection")));

尽情享受!!