Asp.net mvc 代码优先数据库死锁

Asp.net mvc 代码优先数据库死锁,asp.net-mvc,entity-framework,asp.net-mvc-4,ef-code-first,repository,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Ef Code First,Repository,因此,我使用代码优先的方法构建应用程序,在数据库中保存实体时遇到了一个小问题 这是我的实体: public class Customer { public Customer() { Addresses = new List<Address>(); PhoneNumbers = new List<Phone>(); } public Guid CustomerID { get; set;} public virtual ICollect

因此,我使用代码优先的方法构建应用程序,在数据库中保存实体时遇到了一个小问题

这是我的实体:

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;}
}
我有一种感觉,这与这些实体被连接的方式有关,你注意到什么错误或我遗漏了什么吗

以下是实体的保存方式:

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();}

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

新手机必须在新客户之前存储。但是,客户必须存储在手机之前,因为手机需要FK to customer(因为客户电话号码)。循环协会。不幸的是,从代码中看不出如何解决这个问题。特别是上下文的范围不清楚,我怀疑还有更多的
SaveChanges
调用


处理这种情况的一般方法是将几个
SaveChanges
调用包装在一个文件中。第一次调用返回生成的PK值,这些PK值可用作后续调用的FK值。

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

新手机必须在新客户之前存储。但是,客户必须存储在手机之前,因为手机需要FK to customer(因为客户电话号码)。循环协会。不幸的是,从代码中看不出如何解决这个问题。特别是上下文的范围不清楚,我怀疑还有更多的
SaveChanges
调用


处理这种情况的一般方法是将几个
SaveChanges
调用包装在一个文件中。第一次呼叫返回生成的PK值,可作为后续
SaveChanges
呼叫的FK值。

在此过程中,您是否也存储
MailingAddress
和/或
DefaultPhone
?很抱歉这么晚才回答,我已经更新了代码。现在开始。如果所有实体都是新的,EF必须等待生成的PK值将其存储到各种FKs值中。因此,新手机必须在新客户之前存储。但是,客户必须存储在手机之前,因为手机需要FK to customer(因为
客户电话号码
)。循环协会。不幸的是,从代码中看不出如何解决这个问题。特别是上下文的范围不清楚,我怀疑有更多的
SaveChanges
调用。实际上,这就是操作不保存的原因。就在这里的钱上!!!如果你提交你的评论作为回答,我会给它贴上这样的标签:)谢谢!在此过程中,您是否也存储了
MailingAddress
和/或
DefaultPhone
。如果所有实体都是新的,EF必须等待生成的PK值将其存储到各种FKs值中。因此,新手机必须在新客户之前存储。但是,客户必须存储在手机之前,因为手机需要FK to customer(因为
客户电话号码
)。循环协会。不幸的是,从代码中看不出如何解决这个问题。特别是上下文的范围不清楚,我怀疑有更多的
SaveChanges
调用。实际上,这就是操作不保存的原因。就在这里的钱上!!!如果你提交你的评论作为回答,我会给它贴上这样的标签:)谢谢!谢谢你的帮助:)谢谢!谢谢你的帮助:)谢谢!
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();}