是否可以使DbContext只具有泛型类型IDbSet的一个属性,而不是具体IDbSet的集合,例如DbSet。
更具体地说,我想只创建一个通用的DbSet,其中实际类型将被动态确定,例如。
public new IDbSet<T> Set<T>() where T : class
{
return context.Set<T>();
}
我不想创建多个DbSets,例如
DbSet<product> Products { get; set; }
...
实际上我试图使用那个通用的DbSet,但似乎有一个问题。 DbContext不会在数据库中创建相应的表。因此,虽然我可以使用内存中的实体图,但是当将entites存储到数据库中时,会抛出异常(无效的对象名称'dbo.Product'。)
有没有办法强制EF创建对应于dynamicaly创建DbSets的表?
答案 0 :(得分:1)
是的,你可以这样做。
modelBuilder.Configurations.Add
将派生DBSet条目。
如果您打算使用POCO,只需按照这种方式构建模型即可。 所以你保存手册DBSet&lt;&gt;宣言......
但如果你计划在没有POCO的情况下更加动态......
在沿着这条路走下去之前,有很多事情需要考虑。
我认为最有可能是其他问题。 自己构建模型是一项艰巨的任务。当不使用编译时类型/ POCO并且模型缓存和性能成为关键管理任务时,Linq访问会受到影响。
这项任务的实际方面不是低估 从这里开始bContext.OnModelCreating
通常,此方法仅在第一个实例时调用一次 创建派生上下文。那么上下文的模型就是 缓存,适用于应用程序中上下文的所有其他实例 域。可以通过设置ModelCaching来禁用此缓存 给定的ModelBuidler上的属性,但这可能会严重降低 性能。通过使用,可以更好地控制缓存 直接使用DbModelBuilder和DbContext类。
祝你好运