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

Entity Framework 7 Database First configuration (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 table 的数据库。但是,如果我只需要访问 2 怎么办?我不想为我的项目添加所有 50 个 table。如何指定我想要的 table?

  3. 在我的数据库中,我可以有一个名为 "Users" 的 table,因为它是一个包含用户的 table。但是,脚手架应该创建一个 class 作为 "User",因为在它成为列表之前它是单个用户。如何指定正在创建的 table 的名称?

谢谢大家的帮助。

尝试使用

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 时要小心,因为 Server=Server\InstanceName; 可以包含在 ConnectionString 中,但是 dnx ef dbcontext scaffold 目前只接受 Server=Server\InstanceName; 并且你会得到 System.InvalidOperationException 错误 关于 Server=Server\InstanceName; 的用法直接从 appsettings.jsonConnectionString 复制而来。

其他重要参数是 -p | --targetProject,如果您使用 class 库中的存储库,这很重要。如果您在主项目中定义了 ef 命令,并且在主项目的目录中启动了 dnx ef dbcontext scaffold,但是您使用 -p 来引用 class 库项目.

最后一句话。有时需要从数据库中构建 子集 的表。从命令行帮助中并不完全清楚,但是可以多次指定-t (-table) 参数。请参阅 EF7 wiki 中的 the note。因此,如果您只想导入两个表 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 的解释展示了如何在一个命令中导入多个表。 但是 .Net Core 3.1,在 Visual Studio 包管理器控制台中,这种方式给出了错误 - 无法绑定参数,因为多次指定了参数 'Tables'。要为可以接受多个值的参数提供多个值,请使用数组语法。例如,“-parameter 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