我有以下型號:實體框架代碼優先contraint當一個值依賴於另一個
class RentOrder
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
如何添加約束的實體框架代碼首先是StartDate
必須始終小於EndDate
?我知道的唯一方法是通過在覆蓋Seed
方法中執行SQL命令來添加它。有沒有更簡單的方法,沒有SQL?
我有以下型號:實體框架代碼優先contraint當一個值依賴於另一個
class RentOrder
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
如何添加約束的實體框架代碼首先是StartDate
必須始終小於EndDate
?我知道的唯一方法是通過在覆蓋Seed
方法中執行SQL命令來添加它。有沒有更簡單的方法,沒有SQL?
現在解決這個問題的唯一途徑,正如我在問題中提到,是寫在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());
如果enddate小於開始日期,則可以實現set方法並引發自定義異常。
您需要在兩者中實現它,因爲您仍然可以設置相反。下面是一個簡單的例子(假設開始和結束日期不能在同一天):
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;
}
問題是,它不只是一個類。他使用EF映射到數據庫,我需要在數據庫端設置該約束,因此任何將連接到數據庫的代碼(可能不僅來自我的應用程序)將保存始終正確的日期。 –
您的支票的另一個問題(即使我將在客戶端使用它)是我不能設置例如不正確的'EndDate',然後修復'StartDate'。 –
另一種選擇是添加一個ValidateDates()方法,該方法返回日期是否設置正確。 – Tija
我在哪裏可以實現嗎?你的意思是'EndDate'屬性的setter? –
我的意思是二傳手,就像shuniar的例子。如果RentOrder是EF自動生成的類,則可以從它繼承並使用更新的設置器創建要使用的新類。然後,您可以將原始RentOrder設置爲無法在您的EF層之外訪問。 – Tija