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

ここで、Customer_CustomerID という名前の Address and Phone テーブルにエントリが作成され、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. 最初の呼び出しは、後続の呼び出しの FK 値として使用できる、生成された PK 値を返しますSaveChanges

于 2013-10-09T21:04:23.777 に答える