Entity Framework 7 数据库优先配置(MVC 6)

6

经过长时间的不懈努力,终于找到了如何使用EF7数据库优先方法与MVC 6一起使用。以下是具体步骤:

在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"
},

然后在命令提示符中运行以下命令:

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”,因为它是一个单独的用户,直到它成为列表。我该如何指定要创建的表的名称?

感谢大家的帮助。

-o Data--output-dir Data 允许指定输出目录,-t Users--table Users 允许为一个名为 Users 的表创建类。请参见此处 - Oleg
关于第2点和第3点,DB first工具仍然相当有限。我认为这些类型的功能在待办事项列表中。 - jamesSampica
3个回答

10

尝试使用

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

所有上述参数都应该在同一行中,但我将长行包装起来以便更容易阅读。您可以查看源代码,了解RC1中哪些选项支持命令。

在从appsettings.json复制并粘贴ConnectionString时要小心,因为您可能会在ConnectionString中有Server=Server\\InstanceName;,但dnx ef dbcontext scaffold目前只接受Server=Server\InstanceName;,如果直接从appsettings.jsonConnectionString中复制Server=Server\\InstanceName;,则会在使用中出现System.InvalidOperationException错误

另一个重要的参数是-p | --targetProject,如果您在类库中使用存储库,则这一点非常重要。在这种情况下,您在主项目中定义ef命令,并在主项目目录中启动dnx ef dbcontext scaffold,但您使用-p引用类库项目。

最后一点。有时候需要从数据库中提取表的子集。从命令行帮助中并不完全清楚,但可以多次指定-t (-table)参数。请参见EF7维基中的注释。因此,如果您只想导入两个表dbo.Usersdbo.Posts(无论Posts是否有对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


谢谢Oleg。这回答了我大部分的问题。正如Shoe所说,我猜这个功能还是相当有限的,所以我会等待更新,看看他们是否实现了一种改变名称的方法,这样我就可以将“Users”变成“User”类。 - JohnC1
@JohnC1:不用谢!我也希望能尽快扩展ef dbcontext scaffold的功能。例如,我想从列表中导入一些特定的表(例如--table dbo.Users;dbo.Products;dbo.Orders)。 - Oleg
@JohnC1:我更新了我的答案,包括如何导入多个表格:-t dbo.Users -t dbo.Products -t dbo.Orders - Oleg

0

我也想指定几个表。 我按照Oleg的解释来展示如何在一个命令中导入多个表。 但是.Net Core 3.1,在Visual Studio Package Manager控制台中,这种方式会报错 - Cannot bind parameter because parameter 'Tables' is specified more than once. To provide multiple values to parameters that can accept multiple values, use the array syntax. For example, "-parameter value1,value2,value3".(无法绑定参数,因为参数“Tables”被多次指定。要为可以接受多个值的参数提供多个值,请使用数组语法。例如,“-参数值1,值2,值3”。)

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

我的完整命令从Package Manager控制台是 -

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


0

您也可以引用 appsettings 中的连接字符串。假设您在 appsettings.json 文件中有类似下面的代码:

 "ConnectionStrings": {
    "Default": "Server=[DB SERVER];Database=[DATABASE];Integrated Security=True;TrustServerCertificate=True;"
 }

您可以在生成命令中像这样引用该连接字符串:

"Name=ConnectionStrings:Default"

不要像这样:

"Server=[DB SERVER];Database=[DATABASE];Integrated Security=True;TrustServerCertificate=True;"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接