2012-08-07 78 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类来提供对缓存的更多控制。

希望它有帮助