2016-04-12 40 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); 
}); 

上面將採用命名空間的最後組件並將其用作模式名稱。這避免了爲每個實體定製表格綁定的需要。