我可以更改entity framework4.3代码优先的默认模式名称吗?
目前我正在将我的应用程序部署到一个共享的宿主环境,并且代码优先,迁移一直很好,除了一个小小的打嗝。 每次我想要推动网站,我必须使用“更新数据库-script”选项,因为我必须预先为每个表名添加[dbo]
因为默认情况下,共享主机将创build一个默认模式名称,该名称与数据库用户名
如果我login到我的共享主机并创build数据库,则必须创build一个用户。 如果我命名该用户pipe理员,那么在以admin身份login时,代码首先创build的表格类似于“[admin]。[BlogPosts]”。 当应用程序运行时,所有的表都被创build,但是我得到一个EFexception,因为它表示“[dbo]。[BlogPosts]”是无效的。 如果我将表的模式名称重命名为“[dbo]”,而不是“[admin]”,修复它。
为了解决这个问题,我必须生成一个手动执行的迁移脚本,并在所有表名之前添加“[dbo]”,因为脚本只是通过名称来引用表,而不是通过它们的模式和名称引用表。
有一个简单的方法来解决这个问题吗? 如果我所要做的只是发布应用程序并且一切正常,那将是如此的美好。 如果不是模式名称的差异,它将是一个一个点击的部署,一切都将是光荣的。
您可以使用ToTable
方法来指定模式名称。 如果您不指定模式名称,则EF将按照惯例使用dbo
。
public class MyContext { private string schemaName = "Foo"; protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName); } }
对于那些使用entity framework6的人,只需使用HasDefaultSchema
方法:
public class Contexto : DbContext { public DbSet<User> Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema("MyDefaultDbSchema"); } }
对于数据库的第一个实现,它的容易 打开edmx文件,右键单击 – >属性,然后设置默认数据库模式。
对于代码第一,这篇文章似乎最有前途。 http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design
我想添加,因为这是为C#,我已经写了一个VB以下
Public Class ClientDbContext Inherits DbContext Public Property Clients As DbSet(Of Client) Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder) modelBuilder.HasDefaultSchema("dbo") End Sub End Class
首先 ,在EF代码中 ,默认情况下,所有内容都基于SQL Server中的pipe理访问“ DBO-Schema ”的用户访问权限进行设置。 但是,如果特定用户被定义为与共享主机中常见的数据库一起工作,则将不再有Dbopipe理访问。 这次我们的表名是dbo.tableName,例如someUser.tableName,这个点的不准确性使得程序无法运行。 修改并显式分配连接到数据库的用户。 如果使用元数据,则应使用以下方法 :
[Table("MyTableName", Schema="MySchemaName")] public class MyClassName { //Other Lines... }
或者 (不pipestream利的API是否可定制如下:)
modelBuilder.Entity<Blog>().ToTable("MyTableName", schemaName:"MySchemaName");
注意以下几点:
一个很好的学习参考: http : //www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/