EF Основное отношение один к одному, где обе стороны являются необязательными, но одно свойство не может быть аннулировано

#c# #entity-framework-core #ef-core-5.0

Вопрос:

У меня есть модель, которая выглядит так:

 public class Foo
{
    public long Id { get; set; }
    public long? BarId { get; set; }
    public virtual Bar? Bar { get; set; }
}

public class Bar
{
    public long Id { get; set; }
    public virtual Foo? Foo { get; set;}
    
    // This would be easy, but I want a one to one relation
    // public virtual ICollection<Foo> Foos { get; set; } = new HashSet<Foo>();
}
 

Теперь я хочу настроить отношения «один к одному».
Сложность заключается в том, что Bar.Id может иметь значение, которого нет в Foo.BarId столбце.

Так что это должно быть возможно

Фу

ID БарИд
1 3
2 нулевой

Бар

ID
3
4 (нет Фу.БарИд, который соответствует)

Как я могу достичь этого, используя аннотации данных или плавную конфигурацию?

Ответ №1:

просто попробуйте это

 public class Foo
{
    [Key]
    public long Id { get; set; }

    public long? BarId { get; set; }

    [ForeignKey(nameof(BarId))]
    [InverseProperty("Foo")]
    public virtual Bar Bar { get; set; }
}

public class Bar
{
    [Key]
    public long Id { get; set; }

    [InverseProperty("Bar")]
    public virtual Foo Foo { get; set;}

}
 

но если вы используете net5 , вам, возможно, не нужны никакие атрибуты или свободные API