因此,我使用Code First方法构建应用程序,并在数据库中保存实体时遇到了一些问题。
这是我的实体:
public class Customer
{
public Customer()
{
Addresses = new List<Address>();
PhoneNumbers = new List<Phone>();
}
public Guid CustomerID { get; set;}
public virtual ICollection<Address> Addresses { get; set;}
public virtual ICollection<Phone> PhoneNumbers { get; set;}
public virtual Address MailingAddress {get; set;}
public virtual Phone DefaultPhone {get; set;}
}
现在,这会在地址和电话表中创建一个名为Customer_CustomerID的条目,并在DefaultPhone_PhoneID和MailingAddress_AddressID的Customer表中创建一个条目,两个Guids。
每当我保存我的实体时,都会收到以下消息:
"Inner Exception: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.”
我觉得这与这些实体的联系方式有关,你注意到有什么不对或我错过的东西吗?
这是实体的保存方式:
public ActionResult CreateCustomer(Address address, Phone phone)
{
Customer cust = new Customer();
repository.Phone_Save(phone);
cust.PhoneNumbers.add(phone);
cust.DefaulPhone = phone;
repository.Address_Save(address);
cust.Addresses.add(address);
cust.MailingAddress = address;
repository.Customer_Save(cust);
}
public void Customer_Save(Customer customer);
{
Customer entity = context.Customers.Find(customer.CustomerID);
if (entity == null)
{
context.Customers.Add(customer);
entity = customer;
}
else
{
context.Entry(entity).CurrentValues.SetValues(customer);
}
context.SaveChanges();
context.Entry(entity).Reload();}
答案 0 :(得分:1)
如果所有实体都是新实体,则EF必须等待生成的PK值将这些值存储到各种FK值中。这会导致鸡蛋问题。
新手机必须存放在新客户面前。但是,客户必须存储在手机之前,因为手机需要FK给客户(因为cust.PhoneNumbers)。循环协会。不幸的是,从你的代码中不明白如何解决这个问题。特别是上下文的范围不明确,我怀疑还有更多SaveChanges
次调用。
处理这种情况的一般方法是在TransactionScope
中包含多个SaveChanges
来电。第一个调用返回生成的PK值,可以将其用作后续SaveChanges
调用的FK值。