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

时间:2011-08-15 20:18:43

标签: c# ef-code-first constraints

我有以下型号:

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

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

3 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

如果enddate小于开始日期,您可以实现set方法并抛出自定义异常。

答案 2 :(得分: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;
}