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.json 和 startup.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")));
尽情享受!!
使用 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.json 和 startup.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")));
尽情享受!!