使用具有多个数据库架构的实体框架6但使用一个DBContext

时间:2016-04-12 14:54:45

标签: entity-framework dbcontext db-schema

我有一个使用EF作为ORM的应用程序。数据库曾经有一个架构,dbo,一切都运行正常。我最近将我的表组织成4种不同的模式。一个模式的某些表依赖于驻留在不同模式上的表。所有这些似乎都在SQL方面有效。

在应用程序方面,通过EF的所有数据库交互都不再有效。代码编译,模式在解决方案中可见,模型映射指向正确的模式,但是一旦我尝试向表中插入行,它就不起作用。

我看过一些关于使用多个模式的帖子需要使用多个DBContexts,但我宁愿使用一个DBContext。我的所有模式都拥有相同的所有者dbo,我没有看到使用多个DBContexts的原因。

有没有人知道是否有办法实现这一目标?

5 个答案:

答案 0 :(得分:27)

您只能通过流畅映射将每个表映射到自己的架构。在DbContext子类型中,您应该覆盖OnModelCreating(如果您还没有这样做)并添加如下语句:

modelBuilder.Entity<Department>()  
    .ToTable("t_Department", "school");

您未明确映射的实体将被置于默认的dbo架构中,或者您可以通过

提供自己的默认值
modelBuilder.HasDefaultSchema("sales");

(摘自here

答案 1 :(得分:18)

除了Gert Arnold的回应之外,您还可以在实体中使用Table属性:

Layout

答案 2 :(得分:7)

@GertArnold的回答很明显。但是对于纯语法糖果,您也可以通过约定从模型的命名空间中提取模式。我们发现这有用处理多个模式

modelBuilder.Types().Configure(e => {
        var schema = e.ClrType.Namespace.Split('.').Last().ToLower();
        var name = entity.ClrType.Name;
        return entity.ToTable(name, schema);
});

上面将采用命名空间的最后一个组件并将其用作模式名称。这样就无需为每个实体定制表绑定。

答案 3 :(得分:0)

好的,您将架构放在类头等中,但是在哪里定义该架构?例如:

[Table("Test", Schema = "test1")]
public class Test
{
    public int Id { get; set; }
}

[Table("Test2", Schema = "test2")]
public class Test2
{
    public int Id { get; set; }
}

但是将test1和test2放在哪里?不同的DbContext还是在哪里?

答案 4 :(得分:0)

就我而言,可能是我使用DB First来生成我的EDMX文件,因此它不调用OnModelCreating方法。

我最终删除了EDMX文件中的所有store:Schema="YourSchema"Schema="YourSchema",并通过如下所示用bat编写了一个powershell command文件并执行了{{1 }}中的bat

Projec Pre-Build Event