Entity Framework Core 2 отношение один к одному «на одном столе» - PullRequest
0 голосов
/ 24 июня 2018

У меня есть сущность, которая имеет отношения один к одному с собой:

public class Link
{
    public long Id { get; set; }
    public long OtherLinkId { get; set; }
    public Link OtherLink { get; set; }
}

Как я могу определить эту взаимосвязь с помощью свободного API?

Мое решение:

modelBuilder.Entity<Link>()
            .HasOne(x => x.OtherLink)
            .WithOne(x => x.OtherLink)
            .OnDelete(DeleteBehavior.Restrict);

но при миграции пытается создать вторую OtherLink.

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Этого можно добиться, используя атрибут ForeignKey, который можно обнулять в классе модели.

public class Link
{
    public long Id { get; set; }
    public long? OtherLinkId { get; set; } = null;

    [ForeignKey("OtherLinkId")]
    public Link OtherLink { get; set; }
}
0 голосов
/ 24 июня 2018

Вам нужно указать это. EF конвенции не может найти его без вашей помощи.

Если вы не хотите следовать правилам и вам нужно указать это с помощью атрибута аннотации данных ForeignKey, как показано ниже:

[ForeignKey("OtherLinkId")]
public Link OtherLink { get; set; }

Или используя свободную конфигурацию:

modelBuilder.Entity<Link>()
            .HasOne(x => x.OtherLink)
            .WithOne(x => x.OtherLink)
            .HasForeignKey(p => p.OtherLinkId);
            .OnDelete(DeleteBehavior.Restrict);

Важное примечание: Ваше свойство внешнего ключа должно иметь значение NULL, без которого вы не сможете вставить элемент в вашу таблицу OtherLink.

Ваш окончательный код должен выглядеть следующим образом:

public class Link
{
    public long Id { get; set; }
    public long? OtherLinkId { get; set; } // <- Without this you'll be unable to insert a single link.

    [ForeignKey("OtherLinkId")] // <- remove this if you use Fluent Configuration.
    public Link OtherLink { get; set; }
}
...