Asp.net mvc 3 实体框架4.1:是否可以从包含多个表的数据上下文中保存单个表?

Asp.net mvc 3 实体框架4.1:是否可以从包含多个表的数据上下文中保存单个表?,asp.net-mvc-3,entity-framework-4.1,repository-pattern,unit-of-work,Asp.net Mvc 3,Entity Framework 4.1,Repository Pattern,Unit Of Work,我有一个鸡和蛋的问题,这很简单,所以我想问一下,在所有主键都是标识字段的情况下,保存聚合根的正常模式是什么 我有一个典型的联系人实体: Customer { HomeAddress { } WorkAddress { } } 其中两个地址都存储在地址表中,唯一的主键是标识字段。我们检查所有字段以保持唯一的地址记录 问题是: 我需要检索Address identity字段来连接外键,因此我在保存客户记录之前只保存唯一的地址记录,否则我将加载现有

我有一个鸡和蛋的问题,这很简单,所以我想问一下,在所有主键都是标识字段的情况下,保存聚合根的正常模式是什么

我有一个典型的联系人实体:

 Customer {
      HomeAddress {
      }
      WorkAddress {
      }
 }
其中两个地址都存储在地址表中,唯一的主键是标识字段。我们检查所有字段以保持唯一的地址记录

问题是:

  • 我需要检索Address identity字段来连接外键,因此我在保存客户记录之前只保存唯一的地址记录,否则我将加载现有地址
  • 如果地址与客户在同一个DC中,则客户过早地保存(未设置所有记录)
  • 如果地址位于单独的DC中,则它不会连接到拥有自己DC的客户记录,因为您不能将一个实体与两个DC关联(不能在一个DC中打开,然后在另一个DC中保存)
  • 因此,我的想法是,我需要为每个地址创建一个单独的存储库,然后在另一个DC中再次单独加载该地址,为相同的信息对数据库进行冗余调用


    是否有办法在Entity Framework 4.1中的数据上下文/容器中部分保存记录?例如,要在仍在同一个DC中的情况下自行保存地址?

    据我所知,您粗体问题的答案是“否”。上下文是一个工作单元,
    SaveChanges
    在单个事务中将每个新的、更改的或删除的对象提交到数据库。您不能有选择地说:只保存这个或那个对象,或者只保存状态为“已添加”的实体,而不提交状态为“已修改”或“已删除”或其他内容的实体

    作为一种解决方法,您可以尝试:

    using (var context1 = new MyContext())
    {
        Address address = context1.Addresses.Where(predicate).FirstOrDefault();
        // if address != null it is attached now to context1
        if (address == null)
        {
            // ... otherwise create new address in another context and save
            using (var context2 = new MyContext())
            {
                address = new Address { Name = name, ... }
                context2.Addresses.Add(address);
                context2.SaveChanges();
            } // context2 destroyed now and address is not attached to it anymore
            // ... and attach to context1
            context1.Addresses.Attach(address);
        }
    
        customer.HomeAddress = address;
    
        // ...
    
        context1.SaveChanges();
    }
    
    这样,地址就不会同时附加到两个上下文中。但我不确定这是否有效

    编辑

    我必须补充一点(因为我上面的代码看起来很奇怪),“通常”你可以单独在
    context1
    中完成这一切。但是我这样理解你的第2点,
    /…
    (我不理解)在
    保存更改之前发生了一些事情,这会阻止你同时保存新地址和客户