【问题标题】:Entity Framework 7 Database First configuration (MVC 6)Entity Framework 7 数据库优先配置 (MVC 6)
【发布时间】:2016-03-31 03:14:43
【问题描述】:

经过长期不懈的努力,终于弄清楚了如何使用 MVC 6 使用 EF7 Database first 方法。事情是这样的:

App.Impl -> project.json:

"frameworks": {
    "net451": { },
    "dnx451": { }
},
"dependencies": {
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final"
},

然后从 cmd 运行命令:

dnx ef dbcontext scaffold "Server=ip,port;Database=db;User Id=user;Password=pass;" EntityFramework.MicrosoftSqlServer

我面临的三个问题。在我的 Impl 项目中。

  1. 我有一个专用于数据的文件夹。我的数据文件夹应该包含所有与数据库相关的东西,例如 DbContext、DbClasses。但是,Scaffold 在根目录下创建这些文件。如何指定要创建这些文件的文件夹?

  2. 在我的工作场所,我可以拥有一个包含 50 个表的数据库。但是,如果我只需要访问 2 怎么办?我不想为我的项目添加所有 50 个表。如何指定我想要的表格?

  3. 在我的数据库中,我可以有一个名为“Users”的表,因为它是一个包含用户的表。但是,scaffold 应该将类创建为“User”,因为它在成为 List 之前是单个用户。如何指定正在创建的表的名称?

感谢大家的帮助。

【问题讨论】:

  • -o Data--output-dir Data 允许指定输出目录,-t Users--table Users 允许为一个表用户创建类。见here
  • 关于第 2 点和第 3 点,DB 优先工具仍然非常有限。我认为这些类型的功能正在积压中。

标签: asp.net-core asp.net-core-mvc entity-framework-core


【解决方案1】:

尝试使用

dnx ef dbcontext scaffold 
    "Server=Server\InstanceName;Database=db;Trusted_Connection=True;"
    EntityFramework.MicrosoftSqlServer 
    --dataAnnotations
    --outputDir Data
    --verbose
    --table dbo.Users

以上所有参数都应该在同一行中,但我将长行包裹起来以更容易阅读。您可以查看the source code 以了解RC1 中哪些选项支持scaffold 命令。

小心从appsettings.json复制和粘贴ConnectionString,因为ConnectionString中可能有Server=Server\\InstanceName;,但dnx ef dbcontext scaffold目前只接受Server=Server\InstanceName;,你会得到System.InvalidOperationException错误关于Server=Server\\InstanceName;的用法,直接从appsettings.jsonConnectionString复制过来。

另外一个重要的参数是-p | --targetProject,如果你在类库中使用repository,这个参数很重要。如果您在主项目中定义了ef命令,并且您在主项目目录下启动dnx ef dbcontext scaffold,但您使用-p引用类库项目。

最后一句话。有时需要从数据库中构建 子集 表。从命令行帮助中不是很清楚,但是可以多次指定-t (-table) 参数。请参阅 EF7 wiki 中的 the note。因此,如果您只想导入两个表dbo.Usersdbo.PostsPosts 是否具有Users 的外键),那么您可以使用以下语法

dnx ef dbcontext scaffold 
    "Server=Server\InstanceName;Database=db;Trusted_Connection=True;"
    EntityFramework.MicrosoftSqlServer 
    -a
    -o Models
    -v
    -t dbo.Users
    -t dbo.Posts

更新:应该在 ASP.NET Core RC2 及更高版本中使用 dotnet ef dbcontext scaffold 而不是 dnx ef dbcontext scaffold

【讨论】:

  • 谢谢奥列格。这回答了我的大部分问题。正如 Shoe 所说,我想这个功能仍然很有限,所以我会等待更新,看看他们是否实现了更改名称的方法,这样我就可以将“用户”变成“用户”类。
  • @JohnC1:不客气!我也希望尽快扩大ef dbcontext scaffold 的可能性。例如,我希望能够从列表中导入一些特定的表(例如--table dbo.Users;dbo.Products;dbo.Orders
  • @JohnC1:我更新了我的答案,包括如何导入多个表:-t dbo.Users -t dbo.Products - t dbo.Orders
【解决方案2】:

我还想指定一些表格。 我按照 Oleg 的说明展示了如何在一个命令中导入多个表。 但是 .Net Core 3.1,在 Visual Studio 包管理器控制台中,这种方式给出了错误 - 无法绑定参数,因为多次指定了参数“表”。要为可以接受多个值的参数提供多个值,请使用数组语法。比如“-参数value1,value2,value3”。

所以 Oleg 的语法必须更改为 - t dbo.Users,dbo.Products,dbo.Orders

我的完整命令来自包管理器控制台 -

Scaffold-DbContext "Data Source=servername;Initial Catalog=dbname;User ID=usn;PWD=mypw;Connect Timeout=100" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -f -t dbo.Users,dbo.Products ,dbo.Orders

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2013-06-13
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多