实体框架核心从现有数据库创建模型

时间:2017-01-17 19:18:52

标签: c# .net entity-framework

使用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模型和实体的唯一方法,与现在使用完整实体框架的方式相比,这种进展有多大?

5 个答案:

答案 0 :(得分:42)

我知道这个问题有点陈旧,但我认为这对于遇到同样问题的人来说非常有用。

如果我已正确理解您的问题,您需要指定应生成哪些表。 如果将-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并仅生成表格"产品,类别和供应商"。显然,你可以添加更多的表,你只需要用逗号分隔它们。

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

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

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:5)

我的情况是我有一个带有DbContexts的.net 4.5+类库。

这些DbContexts是使用“现有数据库中的代码优先”向导从现有数据库创建的。 EF Core似乎缺少此向导。

要从与EF Core兼容的现有数据库创建新的Code First DbContext,我会松散地遵循指南here

我的步骤:

  • 创建了新的核心类库

  • 添加了nuget包 Microsoft.EntityFrameworkCore

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

  • 打开nuget Package Manager控制台

  • 输入command

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

    Microsoft.EntityFrameworkCore.SqlServer
    

请注意,使用非Core项目时,您可能会遇到nuget Package Manager控制台的问题。我通过创建一个新的Core类库而不是.net一个来避免这个问题。

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

答案 3 :(得分:2)

您还可以应用作弊者的方法:打开VS2015,创建一个与实际项目同名的新类库,然后运行实体数据模型向导。

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

但是,如上所述运行scaffold命令是一种更好的解决方案。

答案 4 :(得分:-1)

想要使用dotnet核心将Sql数据库模式转换为EF核心的人员请遵循以下步骤:

一个接一个地运行所有命令(对于要创建新项目的用户来说,第一个命令是其他命令,否则您可以忽略该命令,而只是从项目根文件夹中运行其他给定命令)

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

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

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

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

使用所需的控制器名称更改 MyNewController ,使用要定位的models文件夹中的模型名称更改 ModelName ,最后更改 MyDbContext 系统生成的上下文文件名可以在“模型”文件夹中找到

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

appsettings.json 在行后添加

“ AllowedHosts”:“ *”,

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

startup.cs 文件添加到该行之前

services.AddMvc()。SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

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

享受!