2011-08-15 27 views
4

我有以下型號:實體框架代碼優先contraint當一個值依賴於另一個

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

如何添加約束的實體框架代碼首先是StartDate必須始終小於EndDate?我知道的唯一方法是通過在覆蓋Seed方法中執行SQL命令來添加它。有沒有更簡單的方法,沒有SQL?

回答

3

現在解決這個問題的唯一途徑,正如我在問題中提到,是寫在Seed方法SQL的命令:

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

如果enddate小於開始日期,則可以實現set方法並引發自定義異常。

+0

我在哪裏可以實現嗎?你的意思是'EndDate'屬性的setter? –

+0

我的意思是二傳手,就像shuniar的例子。如果RentOrder是EF自動生成的類,則可以從它繼承並使用更新的設置器創建要使用的新類。然後,您可以將原始RentOrder設置爲無法在您的EF層之外訪問。 – Tija

0

您需要在兩者中實現它,因爲您仍然可以設置相反。下面是一個簡單的例子(假設開始和結束日期不能在同一天):

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映射到數據庫,我需要在數據庫端設置該約束,因此任何將連接到數據庫的代碼(可能不僅來自我的應用程序)將保存始終正確的日期。 –

+0

您的支票的另一個問題(即使我將在客戶端使用它)是我不能設置例如不正確的'EndDate',然後修復'StartDate'。 –

+0

另一種選擇是添加一個ValidateDates()方法,該方法返回日期是否設置正確。 – Tija