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 {
}
}
其中两个地址都存储在地址表中,唯一的主键是标识字段。我们检查所有字段以保持唯一的地址记录
问题是:
是否有办法在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点,/…
(我不理解)在保存更改之前发生了一些事情,这会阻止你同时保存新地址和客户