2012-03-05 61 views
42

目前,我正在将我的应用程序部署到共享主机环境,并且除了一个小小的打嗝之外,代码优先与迁移一直很好。每次我想要推送站点时,我必须使用“Update-Database -script”选项,因为我必须在[dbo]前面加上每个表名,因为默认情况下共享主机会创建一个与数据库用户名同名的默认模式名。我可以更改实体框架4.3代码优先的默认模式名称吗?

如果我登录到我的共享主机并创建数据库,则必须创建一个用户。如果我将该用户名命名为admin,那么在以admin身份登录时,代码首先会创建如下所示的“[admin]。[BlogPosts]”。当应用程序运行时,所有的表都被创建,但是我得到一个EF异常,因为它表示“[dbo]。[BlogPosts]”无效。如果我将该表的模式名称重命名为“[dbo]”,而不是“[admin]”,修复它。

为了解决这个问题,我必须生成一个手动执行的迁移脚本,并在所有表名之前添加“[dbo]”,因为脚本只通过名称引用表,而不是通过它们的模式和它们的名称名称。

有没有简单的方法来解决这个问题?如果我所要做的只是发布应用程序并且一切正常,那将会非常好。如果不是模式名称的差异,它将是一次点击部署,一切都将是光荣的。

+3

您可以尝试为管理员帐户运行['ALTER USER'](http://msdn.microsoft.com/en-us/library/ms176060.aspx)并指定'dbo'作为默认模式。 (这并没有回答这个问题,但可能是一个解决方案) – 2012-03-05 07:42:56

+0

我实际上喜欢这个解决方案远比手动指定表映射更好。 – Chev 2012-03-05 08:10:44

+0

这个问题的标题是“我可以在实体框架4.3 code-first?中更改默认模式名称吗?”接受的答案是我觉得最好的答案是那个问题。 – Chev 2016-09-21 07:43:34

回答

32

您可以使用ToTable方法指定模式名称。如果您未指定模式名称,则EF将按惯例使用dbo

public class MyContext 
{ 
    private string schemaName = "Foo"; 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName); 
    } 
} 
+4

这是一个很好的解决方案。只是说我必须明确地将每个实体映射到一个表。我有很多。我希望我能指定一个默认模式名称。或者我希望如果EF决定使用“dbo”,那么它应该在运行SQL时在表名前明确添加“dbo”。 – Chev 2012-03-05 07:39:10

+0

@AlexFord True。希望有一个设施可以添加自定义约定。 – Eranga 2012-03-05 07:50:49

+7

我接受了这个,但我没有使用它。这确实是一个解决方案,但我选择使用简单选项,并使用Damien_The_Unbeliever的选项“ALTER USER admin WITH DEFAULT_SCHEMA = dbo”更改数据库用户的默认架构。现在,默认情况下将在dbo下创建不指定模式的新表。 – Chev 2012-03-05 18:51:38

117

对于使用实体框架6这些功能,只需使用HasDefaultSchema方法:

public class Contexto : DbContext 
{ 
    public DbSet<User> Users { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema("MyDefaultDbSchema"); 
    } 
} 
+4

耶!我很高兴他们最终添加了本地支持。 – Chev 2014-02-27 18:51:18

+2

这也适用于SQLCE,如果你想完全脱离模式。只需使用'String.Empty'。 – InteXX 2014-08-06 22:16:43

+0

对于那些想知道的,是的,你可以只添加这一行代码,并且只要你没有明确地在表格上设置一个模式,当你进行“添加迁移”时,它们都会“移动”,然后'更新数据库'。 – adudley 2016-02-05 14:23:22

4

我想补充的,因为这是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 
1

EF代码优先,默认情况下,所有内容均基于用户访问权限设置,SQL管理员通过管理访问“DBO-Schema”河但是,如果特定用户被定义为与共享主机中常见的数据库一起工作,那么将不再有Dbo管理访问权限。这次我们的表名是dbo.tableName,例如someUser.tableName,而且这个点的不准确性使得程序无法运行。修改并明确分配连接到数据库的用户。如果使用元数据,下面的方法应该是使用

[Table("MyTableName", Schema="MySchemaName")] 
public class MyClassName 
{ 
//Other Lines... 
} 

或者(无论流利的API是定制如下:)

modelBuilder.Entity<Blog>().ToTable("MyTableName", schemaName:"MySchemaName"); 

注意以下几点: enter image description here

很好的学习参考: http://www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/