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