9

Code first と TPT (Table per Type) 継承で EF を使用しています。私は次のモデルを持っています:

public partial class AccountHolder
{
    public int AccountHolderId { get; set; }

    public virtual Address Detail { get; set; }  
    public virtual Nominee Nominee { get; set; }   
}

public partial class Nominee
{
    public int NomineeId { get; set; }             
}

public abstract class Address
{
    public int AddressId { get; set; }
    ...
}

public class PersonalDetail : Address
{
    public int PersonalDetailId { get; set; }
    ...
}

流暢な API:

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee)
                                            .WithRequired()
                                            .WillCascadeOnDelete();

このチュートリアルによると、ここに AccountHolder と Address の間のポリモーフィックな関係があります。PersonalDetail は Address を継承します。私の問題は、AccountHolder を削除するたびに、関連する PersonalDetail 情報を Address および PersonalDetail テーブルから削除するように EF が処理するようにしたいのですが、現在これはうまくいきません。流暢な API またはその他の方法でこの動作を実装する方法を教えてください。アプローチ ?

編集:

この構成を使用しているときに投稿された回答によると:

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail)
                                            .WithRequired()
                                            .WillCascadeOnDelete();

カスケード削除を有効にするため、AccountHolder と Nominee の間の既存の 1 対 1 の関連付けと競合します。例外は次のとおりです。

競合する変更が検出されました。これは、同じキーを持つ複数のエンティティを挿入しようとしたときに発生することがあります。

4

1 に答える 1

1

EntityTypeConfiguration を指定するときは、WillCascadeOnDelete 関数を確認してください。

http://msdn.microsoft.com/en-us/library/gg679348(v=vs.103).aspx

あなたが質問に投稿した例では、次のものがあります。

modelBuilder.Entity<Customer>()
              .HasOptional(c => c.BillingAddress)
              .WithRequired();

その最後に(またはカスケードしたいエンティティに対して)WillCascadeOnDelete(true)を平手打ちすると、それが実行されます。何かのようなもの:

modelBuilder.Entity<AccountHolder>().HasOptional(a => a.Address).WithRequired().WillCascadeOnDelete(true);
于 2013-03-06T18:13:27.637 に答える