7

次のように定義された Contact と Phone の間に 1 対多の一方向の関係があります。

class Contact {
    int ContactId {get; set}
    ICollection<Phone> Phones {get; set}
}
class Phone {
    int PhoneId {get; set;}
    string PhoneNumber {get; set;}
}

ドメインレイヤーで、次のことを試みます。

someContact.Phones.Remove(somePhone);

関係が必須として定義されているため、電話をかけようとするとcontext.SaveChanges()例外が発生します(たとえば、電話は連絡先なしでは存在できません)。Phone で外部キーまたはナビゲーション プロパティを使用せずに、呼び出す前に呼び出す
必要なしに、これを解決するにはどうすればよいですか?DbSet<Phone>.Remove(Phone)SaveChanges()

4

2 に答える 2

1

あなたが説明する2つのことは別のものであるため、基本的にあなたはあなた自身の質問に答えました:

  1. オブジェクトのリンク解除
  2. オブジェクトの削除

EF がこれを行う賢い方法があるかもしれませんが、他の人が同じ質問をし、あなたがほのめかした答えを提示されています。

例: EF 4.1: コレクションから子オブジェクトを削除しても削除されません - なぜですか?

于 2012-12-19T15:43:28.760 に答える
0

マシューが単一のステップで説明した両方のあぶみ骨を行う方法があります。モデルを少し変更する必要があります。エンティティに外部キーを追加し、と の両方をPhone含む複合キーを作成する必要があります。PhoneIdContactId

これにより、Phoneクラスのインスタンスがクラスのインスタンスに関連付けられますContact。これらの設定では、連絡先から電話を削除するとsomeContact.Phones.Remove(somePhone);、EF は電話を DB から削除します。これは、特定の連絡先に接続しないと電話が存在できないことがわかっているためです。

モデル:

public class Contact {
    public int ContactId { get; set; }
    public virtual ICollection<Phone> Phones { get; set; }
}

public class Phone {
    public int PhoneId { get; set; }
    public int ContactId { get; set; }
    public string PhoneNumber { get; set; }
}

構成:

modelBuilder.Entity<Contact>()
    .HasMany(o => o.Phones)
    .WithRequired()
    .HasForeignKey(f => f.ContactId)
    .WillCascadeOnDelete(true);

modelBuilder.Entity<Phone>()
    .HasKey(o => new { o.PhoneId, o.ContactId });
于 2012-12-21T10:45:58.190 に答える