【问题标题】:Entity Framework Core creating model from existing databaseEntity Framework Core 从现有数据库创建模型
【发布时间】:2017-06-01 23:51:46
【问题描述】:

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

根据ASP.NET Core - Existing DatabaseMicrosoft 文章,您需要在包管理器控制台中运行类似这样的命令:

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

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

【问题讨论】:

  • 您的部分问题回答了您的主要问题:“您如何生成..[...]” - 您已将其粘贴到您的问题中。有一个名为 Entity Framework Power Tools 的现有 VS 扩展,但看起来它尚未更新为与 EF Core 一起使用。您习惯于哪种约定可以让您选择要生成的对象?
  • @MarkC。使用完整的实体框架,您会看到一个数据库对象列表,您可以在创建新实体数据模型(edmx 文件)时从中进行选择。

标签: c# .net entity-framework reverse-engineering scaffolding


【解决方案1】:

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

【讨论】:

  • 哇,还有很多东西不见了……那么为什么有人要使用这个被称为 EF Core 的残缺 ORM 呢?跨平台是使用 EF Core 的唯一优势/激励因素吗?
  • 实际上您可以控制导入的表,请查看 Scaffold-dbContext 文档:docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell 您有 -Tables 参数,您可以在其中指定要导入的所有表,这里是一个例子:github.com/aspnet/EntityFramework/wiki/…
  • @Bouam 完成此操作后,您是否仍会获得 edmx UI,您可以在其中查看和编辑数据库对象和字段并查看表之间的关系?
【解决方案2】:

我的情况是我有一个 .net 4.5+ 类库,其中包含 DbContexts。

这些 DbContext 是使用“现有数据库中的代码优先”向导从现有数据库创建的。 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 包管理器控制台

  • 输入command

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

    Microsoft.EntityFrameworkCore.SqlServer
    

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

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

【讨论】:

  • +1 用于创建一个新的核心类库,而不是一个 .net 类库。 .Net 4.x 项目在 Microsoft.EntityFrameworkCore.Design 上抛出 FileNotFoundException
  • 它们都是.NET,我想你的意思是使用.NET Core 类库而不是.NET Framework 类库。
【解决方案3】:

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

如果我正确理解了您的问题,您想指定应该生成哪些表格。 如果您将-Tables 参数添加到命令中,应该可以。

这是我用来生成 3 个数据库表的命令(在 Package-Manager 控制台中):

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

如您所见,我使用 Northwnd 数据库并仅生成“产品、类别和供应商”表。显然,您可以添加更多表格,只需用逗号分隔它们即可。

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

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

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

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

【讨论】:

  • 谢谢,我只是认为从允许您查看和编辑表格、关系、字段等的功能齐全的 edmx UI 转到一些命令行工具并吹捧它作为地面制动进展是可笑的...
  • 不知道MS最近在搞什么破解。 Core 解决了在非 IIS 服务器上运行 .Net 的问题......运行 MS 的 IT 商店中有 1% 的问题,如果这个想法赶上对 Windows 服务器的需求减弱......作为一个商业计划,我不得到它。
  • @HiHo 我复制了你的代码并在包控制台中运行,但之前没有任何反应,但之前同样适用于 .net core 1.1,我最近也使用 ef 升级到 core 2.0,我无法更新模型. (github.com/aspnet/EntityFrameworkCore/wiki/Roadmap) 他们说 我们将尽最大努力完成或至少在这些方面取得良好进展:
【解决方案4】:

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

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

但是,像上面那样运行脚手架命令是一个更好的解决方案。

【讨论】:

    【解决方案5】:

    想要使用 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(CompatibilityVersion.Version_2_2);

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

    享受!!

    【讨论】:

    • dotnet ef dbcontext scaffold "Server=&lt;server&gt;;Database=&lt;Database&gt;;User Id=&lt;user&gt;;Password=&lt;password&gt;" Microsoft.EntityFrameworkCore.SqlServer -o Models 为我工作。好奇为什么这会遭到反对?
    猜你喜欢
    • 2021-06-30
    • 2020-12-30
    • 2021-04-04
    • 2011-07-07
    • 2014-03-22
    • 2019-12-06
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    相关资源
    最近更新 更多