Entity framework 实体框架代码优先最小基数

Entity framework 实体框架代码优先最小基数,entity-framework,ef-code-first,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; } } 公共类秩序 {

假设我有以下实体类:

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; }
}
公共类秩序
{
公共int-OrderID{get;set;}
公共ICollection命令行{get;set;}
}
公共类命令行
{
public int OrderLineID{get;set;}
公共秩序{get;set;}
}
我想强制这个关系的最小基数为1;ie我希望确保在没有至少1个订单行的情况下无法创建订单


我使用的是EF code first fluent样式的配置,我能够强制执行订单行必须有订单引用这一事实(使用HasRequired()扩展方法),但我不知道如何防止在没有至少一条订单行的情况下创建订单。

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


您可以创建自定义验证函数并在保存之前调用它们。如果您使用的是
ObjectContext
,则必须自己完成。如果您有一个
DbContext
,您应该能够重写。出于显而易见的原因,只有在通过上下文进行所有数据库修改时,这种方法才有效。如果直接修改数据库表,则不会使用自定义验证函数。

可以完成,但不能使用fluent配置:

public class Order : IValidatableObject
{
    public IEnumerable<ValidationResult> Validate(
           ValidationContext validationContext)
    {
        if (!OrderLines.Any())
            yield return new ValidationResult("At least one line needed");
    }
}
公共类顺序:IValidatableObject
{
公共IEnumerable验证(
ValidationContext(验证上下文)
{
如果(!OrderLines.Any())
返回新的ValidationResult(“至少需要一行”);
}
}

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

非常感谢。我知道这不能在数据库级别完成,但我希望EF能够在保存之前执行它(而不必编写自定义逻辑)。看来情况并非如此。谢谢你的帮助!