2011-08-15 7 views
4

に依存したとき、私は次のモデルがあります:Entity Frameworkのコードファーストのcontraint 1列の値が別の

class RentOrder 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

をどのように私はStartDateが常にEndDate未満でなければならないことをEntity Frameworkのコードファーストで制約を追加することができますか?私が知っている唯一の方法は、オーバーライドされたSeedメソッドでSQLコマンドを実行して追加することです。 SQLを使わないともっと簡単な方法がありますか?

答えて

3

:ここでは簡単な例(開始日と終了日と仮定すると、同じ日にすることはできません)です:

public class MyDatabaseInitializer : DropCreateDatabaseAlways<MyDatabaseContext> 
{ 
    protected override void Seed(MyDatabaseContext context) 
    { 
     context.Database.ExecuteSqlCommand(@"ALTER TABLE Orders 
      ADD CONSTRAINT C_Dates CHECK(EndDate > StartDate)"); 
    } 
} 

やアプリケーションの起動時にどこかに呼び出す:

Database.SetInitializer(new MyDatabaseInitializer()); 
0

終了日が開始日より短い場合は、setメソッドを実装してカスタム例外をスローすることができます。

+0

が、私はそれを実装することができますか?あなたは 'EndDate'プロパティのsetterを意味しますか? –

+0

私はshuniarの例のようにセッターを意味しました。 RentOrderがEF自動生成クラスであれば、それを継承して、使用する新しいクラスを作成し、更新されたセッターで作成することができます。元のRentOrderをEFレイヤーの外からアクセスできないように設定できます。 – Tija

0

それでも両方を実装する必要があるのは、逆の設定が可能だからです。私は質問で述べたように、今、この問題を解決する唯一の方法は、Seed方法でSQL-コマンドを記述することです

class RentOrder 
{ 
    public DateTime StartDate 
    { 
     get { return _startDate }; 
     set 
     { 
      if (value >= _endDate) 
       throw new Exception("Start Date cannot be greater than End Date"); 

      _startDate = value; 
     }; 
    } 
    private DateTime _startDate; 

    public DateTime EndDate 
    { 
     get { return _endDate}; 
     set 
     { 
      if (value <= _startDate) 
       throw new Exception("End Date cannot be less than Start Date"); 

      _endDate = value; 
     }; 
    } 
    private DateTime _endDate; 
} 
+0

問題は単なるクラスではないということです。彼はEFを使用してデータベースにマップされているので、データベース側に制約を設定する必要があります。したがって、DBに接続するコード(アプリケーションだけでなく)によって常に正しい日付が保存されます。 –

+0

あなたのチェックに別の問題があります(たとえ私がクライアント側でそれを使用するとしても)。例えば、最初に間違った 'EndDate'を設定してから' StartDate'を修正することはできません。 –

+0

別のオプションは、日付が正しく設定されているかどうかを返すValidateDates()メソッドを追加するだけです。 – Tija

関連する問題