2016-04-12 38 views
11

我有一个应用程序使用EF作为ORM。数据库曾经有一个模式,dbo和一切工作正常。我最近将我的表格组织成4种不同的模式。一个模式的某些表具有驻留在不同模式上的表的依赖关系。所有似乎在SQL方面都是有效的。使用实体框架6与多个DB架构,但使用一个DBContext

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

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

有谁知道是否有办法做到这一点?

+0

在这里检查http://mehdi.me/ambient-dbcontext-in-ef6/。你将在一个地方管理所有的dbcontexts。 –

+2

我想使用一个dbcontext! – Apollonas

回答

12

只能通过流畅映射将每个表映射到其自己的模式。在你DbContext亚型,你应该重写OnModelCreating(如果你还没有这样做的话),并添加下面的语句:

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

实体,你不映射像这样明确地将被放置在默认dbo模式,或者您也可以通过

modelBuilder.HasDefaultSchema("sales"); 

提供自己的默认值(从here总结)

4

除了格特·阿诺德的性反应,你也可以使用表属性在实体:

using System.ComponentModel.DataAnnotations.Schema; 

[Table("t_Department", Schema = "school")] 
public class Department 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 
4

@GertArnold与他的答案是现货。然而,对于纯语法糖果,您也可以通过约定从模型的命名空间中抽取模式。我们发现这个处理多个模式很有用

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

上面将采用命名空间的最后组件并将其用作模式名称。这避免了为每个实体定制表格绑定的需要。