使用多个上下文编码第一个EF

时间:2016-03-03 00:41:00

标签: entity-framework ef-code-first domain-driven-design bounded-contexts

我尝试首先使用多个上下文创建EF代码。 StaffContext(HR)的一个上下文,另一个是ShippingContext。

  1. 拥有多个上下文的想法有什么优势吗?因为我觉得构建起来很复杂。

  2. 我们如何构建实体?在基本上下文或每个单独的上下文中定义所有内容?

  3. 在这些情况下,我需要访问Staff实体,当我尝试更新数据库时#34;会给我一个错误,因为Staff实体已经存在于其他上下文中。我在不同背景下拥有相同实体的事实是错误的设计吗?

  4. 这就是我现在所拥有的:

    public class StaffContext : BaseContext<StaffContext>
    {
        public DbSet<StaffPosition> StaffPositions { get; set; }
    
        public DbSet<Staff> Staffs { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
    
    public class ShippingContext : BaseContext<ShippingContext>
    {
        public DbSet<Armada> Armadas { get; set; }
    
        public DbSet<Product> Products { get; set; }
    
        public DbSet<Shipment> Shipments { get; set; }
    
        public DbSet<ShipmentDetail> ShipmentDetails { get; set; }
    
        public DbSet<ShipmentHandler> ShipmentHandlers { get; set; }
    
        public DbSet<ShipmentOrder> ShipmentOrders { get; set; }
    
        public DbSet<ShipmentOrderDetail> ShipmentOrderDetails { get; set; }
    
        public DbSet<Staff> Staffs { get; set; }
    
        public DbSet<Pangkalan> Pangkalans { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
    

    提前多多感谢。

1 个答案:

答案 0 :(得分:1)

我真的不知道你为什么要首先这样做 - 在我看来,只要有需要就可以重新创建一个上下文,这样会更好,更容易。但是,让我们开始:

至1:

  • 多个上下文可以更容易维护,因为它只是将代码分散到多个对象上 - 如果您对一个上下文有问题,您可以简单地查看它的模型并解决问题。但是,无论如何,你的背景都不应该过于复杂。
  • 多个上下文确实具有以下优点:每个上下文在大多数情况下都不会变得太大,这将带来性能提升。但是,每当您尝试跨越上下文边界时,您将丢弃EF功能,例如为连接和关系修正创建查询。
  • 当您访问具有不同模式的多个数据库或需要不同的模型时,可以使用多个上下文。此外,每当您对数据库执行更新操作(使用SQL而不是迁移)时,您将需要多个上下文来访问更新实体的不同表现形式。

到2:

  • 您不能同时在多个上下文中拥有相同的实体。这也意味着您不必为已包含在另一个上下文中的实体提供DbSet,除非您可以保证不会触及具有不同上下文的相同对象。
  • 如果您没有实体集的DbSets,当然您在此上下文中不需要此实体的模型配置。但是,可以在基本上下文中完成常规和数据类型映射等常规操作。此外,这可能是与上下文相关的帮助功能的最佳位置。

至3,虽然已经提到:

  • 可以有多个上下文的位置,但我觉得这应该是一个例外。如果您有多个上下文,那么
  • 会更频繁地遇到并发错误(因为您可能会在不同的上下文中将并发项更改为相同的值)。
  • 无法跨越这些边界访问EF功能(例如导航属性,因为您无法在上下文中保留这些类型的对象)和
  • 不能使用Update-Database / Migrations功能,除非您冒风险在两个上下文中定义所有实体。

我不觉得一般一个糟糕的设计,但它确实会带来一些你必须克服的问题,而在一个环境中拥有所有对象并没有很多缺点,如果有的话。

相关问题