2012-08-07 40 views
0

我正在使用實體框架的數據庫優先方法。我想在一個數據庫中有多個公司,爲此,我希望能夠在創建DBContext時通過在其前面添加前綴(即Company1 $ Users,Company2 $ Users)來覆蓋表名。這一切都工作正常,直到我改變公司。看起來,DBContext緩存實體,下次創建上下文時它不會觸發OnModelCreating。我幾乎在任何地方都在尋找解決方案,但似乎找不到任何解決方案。我是唯一有這個問題的人嗎?它實際上可能嗎?有人可以幫助我嗎?重新創建實體單例

重現問題的代碼如下:

public class User 
{ 
    public int UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Username { get; set; } 
} 

public class EntityMappingContext : DbContext 
{ 
    public String CompanyId { get; set; } 
    public DbSet<User> Users { get; set; } 

    public EntityMappingContext(string companyId = null) : base("DB") 
    { 
     CompanyId = companyId; 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().ToTable(CompanyId + "$Users"); 
     base.OnModelCreating(modelBuilder); 
    } 

} 

要重現該問題,您可以運行以下命令:

using (var context = new EntityMappingContext("Company1")) 
{ 
    foreach (var user in context.Users) 
    { 
     Console.WriteLine(user.FirstName + " " + user.LastName); 
    } 
} 
using (var context = new EntityMappingContext("Company2")) 
{ 
    foreach (var user in context.Users) 
    { 
     Console.WriteLine(user.FirstName + " " + user.LastName); 
    } 
} 

第一和第二上下文查詢公司1 $用戶沉綿我打電話第二個與「公司2」。

回答

0

,如果你去通過文檔here,它說OnModelCreating方法:

通常情況下,這種方法被稱爲只有在創建一個導出的上下文的第一個實例一次。然後,該上下文的模型將被緩存,並用於應用程序域中上下文的所有更多實例。可以通過在給定的ModelBuidler上設置ModelCaching屬性來禁用此緩存,但這會嚴重降低性能。通過直接使用DbModelBuilder和DbContext類來提供對緩存的更多控制。

希望它有幫助