Che*_*hev 48 c# sql entity-framework entity-framework-4 ef-code-first
目前我正在将我的应用程序部署到共享托管环境,并且代码优先与迁移一直很有效,除了一个小的打嗝.每次我想推送网站时,我都必须使用"Update-Database -script"选项,因为我必须在每个表名前加上,[dbo]因为默认情况下共享主机会创建一个与数据库用户名同名的默认模式名称.
如果我登录我的共享主机并创建数据库,那么我必须创建一个用户.如果我将该用户命名为admin,则代码优先创建,同时以管理员身份登录,如"[admin].[BlogPosts]".当应用程序运行时,所有表都被创建但我得到了EF异常,因为它说"[dbo].[BlogPosts]"无效.如果我将表的架构名称重命名为"[dbo]"而不是"[admin]"来修复它.
为了解决这个问题,我必须生成一个手动执行的迁移脚本,并在所有表名前添加"[dbo]",因为脚本只按名称引用表,而不是它们的模式和名称.
有没有一种简单的方法来解决这个问题?如果我所要做的就是发布应用程序和一切正常工作,那将是如此美好.如果它不是模式名称的差异,它将是一键式部署,一切都将是光荣的.
小智 131
对于那些使用Entity Framework 6的人,只需使用以下HasDefaultSchema方法:
public class Contexto : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
}
}
Run Code Online (Sandbox Code Playgroud)
Era*_*nga 33
您可以使用该ToTable方法指定架构名称.如果未指定模式名称,则按惯例使用EF dbo.
public class MyContext
{
private string schemaName = "Foo";
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName);
}
}
Run Code Online (Sandbox Code Playgroud)
在EF Code first 中,默认情况下,一切都是基于用户访问权限设置的,在 SQL Server 中具有管理访问权限“ DBO-Schema ”。但是,如果特定用户被定义为使用共享主机中常见的数据库,则将不再有 Dbo 管理访问权限。这次我们的表名是dbo.tableName,比如someUser.tableName,这点不准确导致程序无法运行。修改并显式分配连接到数据库的用户。如果使用元数据,则应使用以下方法:
[Table("MyTableName", Schema="MySchemaName")]
public class MyClassName
{
//Other Lines...
}
Run Code Online (Sandbox Code Playgroud)
或者(是否Fluent API可自定义如下:)
modelBuilder.Entity<Blog>().ToTable("MyTableName", schemaName:"MySchemaName");
Run Code Online (Sandbox Code Playgroud)
一个很好的学习参考:http : //www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/
对于数据库第一次实现,它很容易.打开edmx文件,右键单击 - >属性并设置默认数据库模式.
对于代码优先,这篇文章似乎最有希望. http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design
| 归档时间: |
|
| 查看次数: |
38191 次 |
| 最近记录: |