1

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

现在,这会在 Address 和 Phone 表中创建一个名为 Customer_CustomerID 的条目,并在 Customer 表中创建 DefaultPhone_PhoneID 和 MailingAddress_AddressID 的条目,这两个都是 Guid。

每当我保存我的实体时,我都会收到以下消息:

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

1 回答 1

1

如果所有实体都是新的,EF 必须等待生成的 PK 值将它们存储到各种 FK 值中。这会给你带来先有鸡还是先有蛋的问题

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

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

于 2013-10-09T21:04:23.777 回答