说我有以下实体类:
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。
答案 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
属性或任何其他模型约束一样。