MVC4、EF5、および SQL Server 2012 Express LocalDB を使用しています。Customer
ドメイン モデルにはとPhone
フィールドEmail
があります。どちらも null にすることができますが、少なくとも 1 つが入力されている必要があります。
クライアント側とサーバー側の両方で FluentValidation を使用して、これを確認します。
しかし、モデルを永続化する必要がある場合、EF5 の制限に遭遇します。両方を必須にすると、持続コードは失敗しますが、両方をオプションにすると、次のようになります。
...
this.Property(q => q.Phone).IsOptional();
this.Property(q => q.Email).IsOptional();
これは私の要件を満たしていません。
Q1 : これをモデル化するにはどうすればよいですか? 簡単な方法はありますか、それともチェック制約を使用する必要がありますか? このチェック制約は大丈夫ですか:
ALTER TABLE dbo.[Customer]
ADD CONSTRAINT constraintAtLeastOneContactDetailRequired
CHECK ( ([Phone] IS NOT NULL) OR ([Email] IS NOT NULL) )
--CHECK ( NOT(COALESCE([Phone], [Email]) IS NULL) ) <--or this?
;
Q2 : 両方のフィールドに UNIQUE 制約があるため、それらを null にすることを許可してチェック制約を追加すると、定義上一意ではない複数の null が存在する可能性があるため、問題が発生しますか?