C# 当一列值依赖于另一列值时,实体框架代码是第一个约束

C# 当一列值依赖于另一列值时,实体框架代码是第一个约束,c#,ef-code-first,constraints,C#,Ef Code First,Constraints,我有以下型号: class RentOrder { public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } } 如何首先在实体框架代码中添加约束,即StartDate必须始终小于EndDate?我知道的唯一方法是通过在overridedSeed方法中执行SQL命令来添加它。没有SQL还有更简单的方法吗?如果结束日期小于开始日期,您可以实现set方法并引发自定义异常。您需要在这两种

我有以下型号:

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

如何首先在实体框架代码中添加约束,即StartDate必须始终小于EndDate?我知道的唯一方法是通过在overrided
Seed
方法中执行SQL命令来添加它。没有SQL还有更简单的方法吗?

如果结束日期小于开始日期,您可以实现set方法并引发自定义异常。

您需要在这两种方法中都实现它,因为您仍然可以设置相反的方法。下面是一个快速示例(假设开始日期和结束日期不能是同一天):

类租赁订单
{
公共日期时间起始日期
{ 
获取{return\u startDate};
设置
{
如果(值>=\u结束日期)
抛出新异常(“开始日期不能大于结束日期”);
_startDate=值;
};
}
私人日期时间(startDate);;
公共日期时间结束日期
{ 
获取{return\u endDate};
设置
{

if(value正如我在问题中提到的,现在解决这个问题的唯一方法是在
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)");
    }
}

我在哪里可以实现它?你是指
EndDate
属性的setter吗?我是指setter,就像shuniar的例子一样。如果RentOrder是EF自动生成的类,你可以从它继承并创建一个新的类来使用更新的setter。然后你可以将原始RentOrder设置为在EF层之外不可访问。问题是这不仅仅是一个类。他是使用EF映射到数据库的,我需要在数据库端设置约束,这样任何连接到DB的代码(可能不仅仅是从我的应用程序)都会保存正确的日期。您的检查还有一个问题(即使我在客户端使用它)例如,我不能先设置不正确的
EndDate
,然后再修复
StartDate
。另一个选项是只添加一个ValidateDates()方法,返回日期设置是否正确。
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());