当1-0.1和1-many都是必需时,如何配置EF模型

本文关键字:何配置 配置 模型 EF 1-many | 更新日期: 2023-09-27 18:10:37

我有两个实体模型,OptionWidgetOptionWidgetValue, OptionWidget有许多OptionWidgetValue,如选项列表,有时其中一个值将是默认值。我知道我可以在OptionWidgetValueDefault添加一个字段来实现这种关系。但是当我尝试用另一种方式,即将OptionWidget中的默认值定义为下面的代码时,我遇到了一些错误:

这个关联的主体端必须使用关系流畅API或数据注释显式配置。

下面是我的模型定义:

public class OptionWidget : ModelBase
{
    [MaxLength(100)]
    public string Name { get; set; }
    public int? DefaultValueId { get; set; }
    [ForeignKey("DefaultValueId")]
    public virtual OptionWidgetValue DefaultValue { get; set; }
    [Required]
    public int ProductId { get; set; }
    public virtual Product Product { get; set; }
    public virtual ICollection<OptionWidgetValue> OptionWidgetValues { get; set; }
}

public class OptionWidgetValue : ModelBase
{
    public string Value { get; set; }
    public decimal UnitPrice { get; set; }
    public virtual ICollection<ValueDependency> Dependencies { get; set; }
    [Required]
    public int OptionWidgetId { get; set; }
    [ForeignKey("OptionWidgetId")]
    public virtual OptionWidget OptionWidget { get; set; }
}

对于1-多关系,我用像这样流畅的API定义它们,它工作得很好。但我该如何定义1-0…1关系为默认值。如果你知道,请帮助我,非常感谢。

 builder.Entity<OptionWidget>()
            .HasMany(e => e.OptionWidgetValues)
            .WithRequired()
            .HasForeignKey(e => e.OptionWidgetId)
            .WillCascadeOnDelete(false);

当1-0.1和1-many都是必需时,如何配置EF模型

您可以使用以下的Fluent API配置:

modelBuilder.Entity<OptionWidget>()
    .HasOptional(e => e.DefaultValue)
    .WithOptionalPrincipal();

这段代码使得关系的to侧是可选的,但是如果你想让OptionWidgetOptionWidgetValue是必需的,使用这个:

modelBuilder.Entity<OptionWidget>()
    .HasOptional(e => e.DefaultValue)
    .WithRequired();