许多域模型在EF 5中共享一个数据上下文

时间:2013-04-06 17:02:16

标签: entity-framework repository entity-framework-5 dbcontext dbset

我最近出于无知和缺乏时间,将几个项目中的域模型(POCO实体类)合并到一个'DataModel'项目中,因为我不想在所有项目上复制专用的DbContexts。令我感到理想的是可以完成泛型,比如DbContext扩展,可以从各种客户端项目中添加DbSet实例。

我已经阅读过这类内容,通常与作者相同的圈子中提到 - 并且我全心全意地同意 - DbSet类完全实现了存储库功能。

任何人都可以提供任何关于构建可以存在于一个项目中的通用DbContext的建议,其中其他项目都可以使用共享DbContext注册其域模型(域实体集),在这些模型中,它们都被分配为拥有DbSet充当他们的存储库?

1 个答案:

答案 0 :(得分:0)

  

构建一个通用的DbContext,它可以存在于一个项目中,其他项目都可以注册其域模型(域实体集)

有趣的想法,但我不确定你会从中获得什么。

首先,你永远不能简单地输入db.Customer(或类似的)。它应始终为genericdb.Set<Customer>()不知道 genericdb是否完全了解Customer。 (它可能尚未注册)。

然后,如何进行注册?有两种方法可以让上下文将类映射到数据库模型:

  1. DbSet派生类中创建DbContext属性,并依赖于有关表名和列名,复数化等的代码优先默认约定。
  2. 提供映射配置。
  3. 第一个选项违背了通用上下文类的目的,因此您必须通过为域中的每个类提供EntityTypeConfiguration<T>来注册域类,也适用于类通常可以没有。 (顺便说一句,这应该在上下文的构造函数中完成。)

    进一步暗示在某个地方你需要一个组件/服务,它知道哪些类属于哪一组,并且能够提供一致的配置列表。因此,除了将专用上下文作为组织原则开箱即用之外,您还必须创建自己的组织者。

    但回到开始。难道你不能创建一个包含DbContext工厂的DAL,该工厂提供以前存在于项目中的上下文吗?您不必以这种方式复制专用的DbContext类。