このデータベースには、Person
,Company
およびPhoneCall
という3つのエンティティがあります。Entity Frameworkが外部キーをNULLに設定しないようにする
Person
は個体を記載する。 Company
には会社が記載されています。 PhoneCall
には、Person
またはCompany
のいずれかの電話の詳細が記載されています。 Person
またはCompany
削除するとき
public class Person
{
public int Id { get; set;}
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
}
public class Company
{
public int Id { get; set;}
public string Name { get; set; }
public string VatNumber { get; set; }
}
public class PhoneCall
{
public int Id { get; set;}
public string Description { get; set;}
public int Duration { get; set;}
public int? PersonId { get; set; }
public Person Person { get; set; }
public int? CompanyId { get; set; }
public Company Company { get; set; }
}
私は、Entity Frameworkを使用して、特定の望ましくない行動を見ています。
Person
を削除すると、エンティティフレームワークは関連するPhoneCall
エントリを更新し、PersonId
をNULLに設定します。関連企業があるので
PhoneCall
のすべてのエントリにnullに
PersonId
を設定する代わりに、Entity Frameworkのの
dbContext.Entry(person).State = EntityState.Deleted;
dbContext.SaveChanges();
、私が希望することは、私はPerson
が削除できないことを知らせるために、いくつかの種類の例外をスローするエンティティフレームワークのためにあります前記Person
を参照してください。
エンティティフレームワークは、両方とも(必然的に)NULL可能であるため、PhoneCall.PersonId
およびPhoneCall.CompanyId
の外部キーを尊重しないという問題があるようです。
私は明らかにそうように削除する前に、自分自身のチェックを実行することができます。
if (phoneCallDbSet.Where(ph => ph.Person == personToDelete).Any())
throw new InvalidOperationException("Cannot delete person with associated calls");
...しかし、私の好みはNULLへの外部キーを設定することから、Entity Frameworkのを防ぐ制限のいくつかの種類を設定することです開発者がこのチェックの実行を忘れると、何も関係していないPhoneCall
テーブルのエントリで終わることはありません。
これは可能ですか?
'int?'の代わりにforeignkey-columnの型を 'int'に変更すると、その関係はnullにできません。なぜ彼らは必然的にヌル可能ですか?どちらかがNULL可能である可能性があるため、関係はNULLになるか、またはNULL可能ではない可能性があり、関係が必要です。あなたがカスケードの削除を行う他のすべて –
[リンク先テーブルのカスケード削除をEFコードで最初に無効にする方法?](http://stackoverflow.com/questions/13705441/how-to-disable-cascade-delete -for-link-tables-in-ef-code-first) – Martheen
2つの列は、会社または個人のいずれかに電話をかけることができるため、NULL可能です。 – NoPyGod