实体框架代码首先是最小基数

时间:2012-08-18 18:10:06

标签: entity-framework ef-code-first

说我有以下实体类:

public class Order
{
    public int OrderID { get; set; }
    public ICollection<OrderLine> OrderLines { get; set; }
}

public class OrderLine
{
    public int OrderLineID { get; set; }
    public Order Order { get; set; }
}

我想强制这种关系的最低基数为1;即我想确保在没有至少1个OrderLine的情况下无法创建订单。

我正在使用EF代码第一个流畅的样式配置,我能够强制执行OrderLine必须有一个Order引用(使用HasRequired()扩展方法)的事实,但是我无法看到如何阻止订单生成至少有一个OrderLine。

2 个答案:

答案 0 :(得分:3)

简而言之:你做不到。您的需求无法映射到数据库约束:订单和订单行单独保存,因此在创建订单并添加订单行时,必须先保存订单或订单行。订单行 - &gt;订单关系由外键支持,因此必须先保存订单。保存订单时,就数据库所知,订单没有订单行,直到稍后才会添加。

您可以创建自定义验证功能并在保存之前调用它们。如果您使用ObjectContext,则必须自己执行此操作。如果您有DbContext,则应该可以覆盖DbContext.ValidateEntity。出于显而易见的原因,这仅在您通过上下文进行所有数据库修改时才有效。如果直接修改数据库表,则不会使用自定义验证函数。

答案 1 :(得分:2)

可以做到,只是没有流畅的配置:

public class Order : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(
           ValidationContext validationContext)
    {
        if (!OrderLines.Any())
            yield return new ValidationResult("At least one line needed");
    }
}

这将在您SaveChanges()时强制执行,就像Required属性或任何其他模型约束一样。