Code First DB死锁

时间:2013-10-08 22:46:10

标签: asp.net-mvc entity-framework asp.net-mvc-4 ef-code-first repository

因此,我使用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();}

1 个答案:

答案 0 :(得分:1)

如果所有实体都是新实体,则EF必须等待生成的PK值将这些值存储到各种FK值中。这会导致鸡蛋问题

新手机必须存放在新客户面前。但是,客户必须存储在手机之前,因为手机需要FK给客户(因为cust.PhoneNumbers)。循环协会。不幸的是,从你的代码中不明白如何解决这个问题。特别是上下文的范围不明确,我怀疑还有更多SaveChanges次调用。

处理这种情况的一般方法是在TransactionScope中包含多个SaveChanges来电。第一个调用返回生成的PK值,可以将其用作后续SaveChanges调用的FK值。