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

Dea*_*uga 20 .net c# entity-framework

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

根据ASP.NET核心 - 现有数据库 Microsoft文章,您需要在程序包管理器控制台中运行如下命令:

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

这使您无法控制要导入的表或视图.是否有可能这是现在使用EF Core对数据库进行逆向工程并创建EF模型和实体的唯一方法,与现在使用完整实体框架的方式相比,这种进展有何进展?

小智 48

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

如果我已正确理解您的问题,您需要指定应生成哪些表.如果将-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
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用Northwnd-Database并仅生成"产品,类别和供应商"表.显然,您可以添加更多表,只需用逗号分隔即可.

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

我曾经-Force覆盖我已经创建的任何模型.

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

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

  • 谢谢,我认为从功能齐全的edmx用户界面开始,它可以让您查看和编辑表格,关系,字段等等一些命令行工具,并将其视为地面制动进度,这是荒谬的... (16认同)
  • 我不知道MS最近有什么破解.Core解决了在非IIS服务器上运行.Net的问题...... 1%运行MS的IT商店存在问题,如果这个想法能够满足对Windows服务器的需求,那么......作为商业计划,我不会得到它. (6认同)

小智 8

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

  • 实际上你可以控制导入的表,看看Scaffold-dbContext文档:https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell你有-Tables参数在哪里指定要导入的所有表,这是一个例子:https://github.com/aspnet/EntityFramework/wiki/Design-Meeting-Notes-(October-1,-2015)#table-selection-in-逆向工程 (5认同)
  • 哇,还有很多遗漏...那么为什么有人要使用这个残缺不全的称为EF Core的ORM?跨平台使用EF Core是唯一的优势/诱因吗? (2认同)
  • @Bouam完成此操作后,您仍然获得edmx UI,可以在其中查看和编辑数据库对象和字段以及查看表之间的关系吗? (2认同)

小智 8

那些想要使用 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
Run Code Online (Sandbox Code Playgroud)

最后...

dotnet ef dbcontext scaffold "Server=servername\instancename;Database=My_Database;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models
Run Code Online (Sandbox Code Playgroud)

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

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

dotnet aspnet-codegenerator controller -name <MyNewController> -m <ModelName> -dc <MyDbContext> --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries 
Run Code Online (Sandbox Code Playgroud)

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

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

appsettings.json 在行后添加

"AllowedHosts": "*",

 "ConnectionStrings": {
    "MyDbConnection": "Server=servername\\instancename;Database=My_Database;Trusted_Connection=True;"
  }
Run Code Online (Sandbox Code Playgroud)

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

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

services.AddDbContext<SwiftRbs_LocalContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("MyDbConnection")));
Run Code Online (Sandbox Code Playgroud)

享受!!


Bau*_*ear 5

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

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

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

我的步骤:

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

  • 添加了nuget包Microsoft.EntityFrameworkCore

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

  • 打开nuget Package Manager控制台

  • 输入命令

    Scaffold-DbContext "data source=MYSQLDBSERVER\MYSQLINSTANCE;initial catalog=MYDB;integrated security=True;MultipleActiveResultSets=True;"
    
    Run Code Online (Sandbox Code Playgroud)
  • 作为提供者进入

    Microsoft.EntityFrameworkCore.SqlServer
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  • +1用于**创建新的核心类库,而不是.net一个。** .Net 4.x项目在Microsoft.EntityFrameworkCore.Design上抛出FileNotFoundException。 (2认同)