我可以在实体框架4.3代码优先更改默认架构名称吗?

时间:2012-03-05 07:12:08

标签: c# sql entity-framework entity-framework-4 ef-code-first

目前我正在将我的应用程序部署到共享托管环境,并且代码优先与迁移一直很有效,除了一个小的打嗝。每次我想推送网站时,我都必须使用“Update-Database -script”选项,因为我必须在每个表名前加上[dbo],因为默认情况下共享主机会创建一个名称相同的默认模式名称作为数据库用户名。

如果我登录共享主机并创建数据库,则必须创建一个用户。如果我将该用户命名为admin,则代码优先创建,同时以管理员身份登录,如“[admin]。[BlogPosts]”。当应用程序运行时,所有表都被创建但我得到了EF异常,因为它说“[dbo]。[BlogPosts]”无效。如果我将表的架构名称重命名为“[dbo]”而不是“[admin]”来修复它。

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

有一种简单的方法来解决这个问题吗?如果我所要做的就是发布应用程序和一切正常工作,那将是如此美好。如果它不是模式名称的差异,那将是一键式部署,一切都将是光荣的。

5 个答案:

答案 0 :(得分:128)

对于使用Entity Framework 6的用户,只需使用HasDefaultSchema方法:

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

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

答案 1 :(得分:32)

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

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

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

答案 2 :(得分:7)

对于数据库首次实现,它很容易。打开edmx文件,右键单击 - &gt;属性并设置默认数据库架构。

首先,对于代码,本文似乎最有希望。 http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design

答案 3 :(得分: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

答案 4 :(得分:4)

首先 EF代码,默认情况下,所有内容都是根据用户访问权限设置的,具有管理访问权限&#34; DBO-Schema &#34;在SQL Server中。但是,如果定义特定用户使用共享主机中常见的数据库,则不再有Dbo管理访问权限。这次我们的表名是dbo.tableName,例如someUser.tableName,这一点的不准确使得无法运行程序。修改并显式分配连接到数据库的用户。 如果您使用元数据,则应使用以下方法

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

Fluent API 是否可自定义如下:)

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

请注意以下事项: enter image description here

研究的一个很好的参考: http://www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/