DbContext与动态DbSet

时间:2013-09-23 10:06:42

标签: entity-framework ef-code-first dbcontext

是否可以使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的表?

1 个答案:

答案 0 :(得分:1)

是的,你可以这样做。

modelBuilder.Configurations.Add

将派生DBSet条目。

如果您打算使用POCO,只需按照这种方式构建模型即可。 所以你保存手册DBSet&lt;&gt;宣言......

但如果你计划在没有POCO的情况下更加动态......

在沿着这条路走下去之前,有很多事情需要考虑。

  • 您选择了正确的ORM吗?
  • 你打算参加POCO吗?
  • 为什么选择DbSet产品{get;组;那么糟糕?
    你会为这一行代码获得很多动作。
  • 您计划在没有类型DBSets的情况下使用哪种数据访问方法
  • 您打算使用Linq to Entity语句吗?
  • 您是否计划为必要的动态数据访问创建表达式树。由于类型在编译时是未知的。
  • 您打算使用数据库模型缓存吗?
  • 如何管理缓存,尤其是在Web中。 ASP环境。

我认为最有可能是其他问题。 自己构建模型是一项艰巨的任务。当不使用编译时类型/ POCO并且模型缓存和性能成为关键管理任务时,Linq访问会受到影响。

这项任务的实际方面不是低估 从这里开始bContext.OnModelCreating

  

通常,此方法仅在第一个实例时调用一次   创建派生上下文。那么上下文的模型就是   缓存,适用于应用程序中上下文的所有其他实例   域。可以通过设置ModelCaching来禁用此缓存   给定的ModelBuidler上的属性,但这可能会严重降低   性能。通过使用,可以更好地控制缓存   直接使用DbModelBuilder和DbContext类。

The modelbuilder class

祝你好运

相关问题