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 项目上。
我有一个专用于数据的文件夹。我的数据文件夹应包含所有与数据库相关的内容,例如 DbContext、DbClasses。但是,Scaffold 在根目录下创建这些文件。如何指定要创建这些文件的文件夹?
在我的工作场所,我可以拥有一个包含 50 table 的数据库。但是,如果我只需要访问 2 怎么办?我不想为我的项目添加所有 50 个 table。如何指定我想要的 table?
在我的数据库中,我可以有一个名为 "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.json
的 ConnectionString
复制而来。
其他重要参数是 -p | --targetProject
,如果您使用 class 库中的存储库,这很重要。如果您在主项目中定义了 ef
命令,并且在主项目的目录中启动了 dnx ef dbcontext scaffold
,但是您使用 -p
来引用 class 库项目.
最后一句话。有时需要从数据库中构建 子集 的表。从命令行帮助中并不完全清楚,但是可以多次指定-t
(-table
) 参数。请参阅 EF7 wiki 中的 the note。因此,如果您只想导入两个表 dbo.Users
和 dbo.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
经过长期不断的努力,终于弄清楚了如何使用 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 项目上。
我有一个专用于数据的文件夹。我的数据文件夹应包含所有与数据库相关的内容,例如 DbContext、DbClasses。但是,Scaffold 在根目录下创建这些文件。如何指定要创建这些文件的文件夹?
在我的工作场所,我可以拥有一个包含 50 table 的数据库。但是,如果我只需要访问 2 怎么办?我不想为我的项目添加所有 50 个 table。如何指定我想要的 table?
在我的数据库中,我可以有一个名为 "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.json
的 ConnectionString
复制而来。
其他重要参数是 -p | --targetProject
,如果您使用 class 库中的存储库,这很重要。如果您在主项目中定义了 ef
命令,并且在主项目的目录中启动了 dnx ef dbcontext scaffold
,但是您使用 -p
来引用 class 库项目.
最后一句话。有时需要从数据库中构建 子集 的表。从命令行帮助中并不完全清楚,但是可以多次指定-t
(-table
) 参数。请参阅 EF7 wiki 中的 the note。因此,如果您只想导入两个表 dbo.Users
和 dbo.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