3

次のような顧客と住所という名前のクラスを持つ単純なモデルがあります。

public class Customer : BusinessEntity
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public DateTime? DateOfBirth { get; set; }

    public decimal? CreditLimit { get; set; }

    public virtual List<Address> Addresses { get; set; }

    public string Email { get; set; }
}

public class Address : BusinessEntity
{
    public string Street { get; set; }

    public string Floor { get; set; }

    public Customer Customer { get; set; }
}

顧客に既存の住所をロードし、その住所を変更して update を呼び出す単体テストを作成しました。コードは次のとおりです。

        Customer newCustomer = new Customer();

        newCustomer.FirstName = "Cosme";

        newCustomer.LastName = "Fulanito";

        newCustomer.Email = "anemail@mail.com";

        customerPersistence.Save(newCustomer);

        Customer existingCustomer = customerPersistence.FindByID(newCustomer.ID.Value);

        Assert.IsNotNull(existingCustomer, "Customer not found after saving");

        existingCustomer.LastName = "Fulanito Modified";

        existingCustomer.Addresses = new List<Address>();

        existingCustomer.Addresses.Add(new Address { Customer = existingCustomer, Floor = "21", Street = "Peron" });

        customerPersistence.Update(existingCustomer);

        Customer loadedCustomer = customerPersistence.FindByID(newCustomer.ID.Value);

        Assert.IsNotNull(loadedCustomer, "Customer not found after updating");

        Assert.IsTrue(loadedCustomer.LastName == existingCustomer.LastName, "Last name not updated");

        Assert.IsNotNull(loadedCustomer.Addresses, "Addresses collection is null");

        Assert.IsTrue(loadedCustomer.Addresses.Count > 0, "Addresses collection is empty");

        existingCustomer = customerPersistence.FindByID(newCustomer.ID.Value);

        Assert.IsNotNull(existingCustomer, "Customer not found after updating");

        existingCustomer.Addresses[0].Floor = "40";

        customerPersistence.Update(existingCustomer);

        Assert.IsTrue(loadedCustomer.Addresses[0].Floor == "40", "Address data not modified");

Context は、DBContext を継承するクラスへの参照です。次のエラーが表示されます。

「Address_Customer」AssociationSet からの関係は「削除済み」状態です。多重度の制約がある場合、対応する「Address_Customer_Source」も「削除済み」状態でなければなりません。

私は何が欠けていますか?OnModelCreating メソッドで Customer と Address の関係を定義する方法に問題がありますか? 私はこれをやっています:

modelBuilder.Entity<Address>()
            .HasRequired(p => p.Customer)
            .WithMany(p => p.Addresses)
            .Map(x => x.MapKey("CustomerID"))

ありがとう、ゴンザロ

4

1 に答える 1

1

Addresses プロパティを ICollection に変更してください。次に、詳細を更新するときに、EntityState が deatched されているかどうかを確認します。切り離されている場合は、更新されたオブジェクト (Customer と Address) をコンテキストにアタッチし、オブジェクトが変更されたことを ObjectStateManager に通知する必要があります。

于 2012-07-19T04:50:44.967 に答える