2016-08-30 22 views
1

このデータベースには、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テーブルのエントリで終わることはありません。

これは可能ですか?

+0

'int?'の代わりにforeignkey-columnの型を 'int'に変更すると、その関係はnullにできません。なぜ彼らは必然的にヌル可能ですか?どちらかがNULL可能である可能性があるため、関係はNULLになるか、またはNULL可能ではない可能性があり、関係が必要です。あなたがカスケードの削除を行う他のすべて –

+0

[リンク先テーブルのカスケード削除をEFコードで最初に無効にする方法?](http://stackoverflow.com/questions/13705441/how-to-disable-cascade-delete -for-link-tables-in-ef-code-first) – Martheen

+0

2つの列は、会社または個人のいずれかに電話をかけることができるため、NULL可能です。 – NoPyGod

答えて

4

いいえ!あなたのコードで明確なチェックをしなくても、あなたが望むものを達成する方法はありません。

プロパティをnullableとして設定すると、必要に応じてnullに設定できることがフレームワークに通知されます。次に、nullに設定されているときにエラーが表示されるのはなぜですか?

プロパティをnull不可能にするか、コードを明示的にチェックして処理します。

+0

私は多くのことを考え出しました。あなたの応答に感謝します。代わりに、データベースにトリガーを手動で作成して列の更新を防止する方法についてどう思いますか?明示的なチェックを行いますが、明示的なチェックを忘れた場合には、列がnullに設定されないようにします。 – NoPyGod

+0

ええ!そのような場合、私は多くの人がやっていることを見てきました。トリガーは良いアイデアのように聞こえる。一貫性のあるデータが必要です。 –

関連する問題