我正在使用Entity Framework的Database First方法。我想在一个数据库中有多个公司,为此我希望能够通过在创建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);
}
}
第一个和第二个上下文查询Company1 $ Users,尽管我用“Company2”调用第二个上下文。
答案 0 :(得分:0)
如果您浏览文档here,它会在OnModelCreating方法中说明:
通常,只有在创建派生上下文的第一个实例时才调用此方法一次。然后缓存该上下文的模型,该模型适用于app域中上下文的所有其他实例。可以通过在给定的ModelBuidler上设置ModelCaching属性来禁用此缓存,但这会严重降低性能。通过直接使用DbModelBuilder和DbContext类,可以更好地控制缓存。
希望有所帮助