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

本文关键字:实体 框架 约束 第一个 代码 依赖于 一个 另一个 | 更新日期: 2023-09-27 18:05:34

我有以下模型:

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());

您可以实现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;
}