实体框架7数据库优先配置(MVC 6)



经过长时间的不懈努力,终于找到了如何使用MVC 6的EF7数据库优先方法。事情就是这样发展的:

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

我面临的3个问题。在我的Impl项目上。

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

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

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

谢谢大家的帮助。

尝试使用

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

以上所有参数都应该在同一行中,但我将长行换行以便于阅读。您可以查看源代码,了解哪些选项支持RC1中的scaffold命令。

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

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

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

dnx ef dbcontext scaffold 
    "Server=ServerInstanceName;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的解释,展示了如何在一个命令中导入多个表。但是,在Visual Studio软件包管理器控制台中的.Net Core 3.1会出现错误-无法绑定参数,因为参数"Tables"被指定了多次。要向可以接受多个值的参数提供多个值,请使用数组语法。例如,"-参数值1,值2,值3"。

因此,Oleg的语法必须更改为-t dbo。用户,dbo.Products,dbo.Orders

我的完整命令来自Package Manager控制台is-

Scaffold DbContext"数据源=服务器名称;初始目录=数据库名称;用户ID=usn;PWD=mypw;连接超时=100"Microsoft.EntityFrameworkCore.SQL Server-OutputDir Models-f-t dbo。用户,dbo.Products,dbo.Orders

您还可以引用您的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;"

最新更新