3

假设我有以下实体类:

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() 扩展方法)的事实,但我看不出如何防止在没有至少一个的情况下创建 Order订单行。

4

2 回答 2

3

简而言之:你不能。您的需求不能映射到数据库约束:订单和订单行是分开保存的,因此当您创建订单并添加订单行时,必须先保存订单或订单行。订单行 -> 订单关系由外键支持,因此必须先保存订单。保存订单时,据数据库所知,订单没有订单行,直到稍后才添加。

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

于 2012-08-18T18:23:30.433 回答
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属性或任何其他模型约束一样,这将被强制执行。

于 2012-08-19T00:49:23.527 回答