Отношения один-к-одному в Entity Framework Core - PullRequest
1 голос
/ 17 марта 2019

Я играл с .NET Core последние пару недель и решил попробовать EF Core (из ASP.NET MVC с NHibernate).Немного покопавшись, я нашел замечательные расширения под названием EF Visual Designer .Это позволяет мне визуально создавать модель и генерировать код.

Я определил простое отношение один к одному, показанное на диаграмме: Простое отношение один к одному

После генерации кода я получаю следующее как код Fluent API:

modelBuilder.Entity<Authentication>()
   .ToTable("Authentications")
   .HasKey(t => t.Id);

modelBuilder.Entity<Authentication>()
    .Property(t => t.Id)
    .IsRequired()
    .ValueGeneratedOnAdd();

modelBuilder.Entity<User>()
     .ToTable("Users")
     .HasKey(t => t.Id);

modelBuilder.Entity<User>()
     .Property(t => t.Id)
     .IsRequired()
     .ValueGeneratedOnAdd();

modelBuilder.Entity<User>()
    .HasOne(x => x.Authentication)
    .WithOne()
    .HasForeignKey("Authentication_Id")
    .IsRequired();

Класс пользователя имеет следующие (соответствующие) свойства:

[Key]
[Required]
public Guid Id { get; set; }
...
public virtual Authentication Authentication { get; set; }

Аутентификация имеет следующее (релевантное) свойство:

[Key]
[Required]
public Guid Id { get; set; }

Однако, когда я пытаюсь сгенерировать миграцию, я получаю следующую ошибку:

Вы настраиваете отношения между «Пользователем» и «Аутентификацией», ноуказал внешний ключ в 'Authentication_Id'.Внешний ключ должен быть определен для типа, который является частью отношения.

Я попытался переключиться на отношение многие-к-одному, и это работает без проблем.Это может быть обходной путь, но не очень чистый.Возможно, это связано с проблемами именования, например, с обоими объектами, имеющими «Id» в качестве первичного ключа?

Если это так, то какова «лучшая практика»?Я даю каждому объекту уникальное имя ID-столбца?Как мне перейти к абстрактной сущности, у которой все производные классы наследуют столбец идентификатора?

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Я никогда не использовал EF Visual Designer для генерации кодов, но, просто взглянув на ваш код, либо сущности User нужен внешний ключ Authentication, либо сущности Authentication нужен внешний ключ User.

Допустим, вы хотите вставить внешний ключ в User:

public class User
{
    [Key]
    [Required]
    public Guid Id { get; set; }

    public Guid AuthenticationId { get; set; }

    // Even this navigation property is optional
    // for configuring one-to-one relationship
    public virtual Authentication Authentication { get; set; }
}

public Authentication
{
    [Key]
    [Required]
    public Guid Id { get; set; }
}

Тогда отношение один-к-одному должно быть настроено как:

modelBuilder.Entity<User>()
    .HasOne(x => x.Authentication)

    // Or like this if you don't have Authentication navigation property:
    //.HasOne<Authentication>()

    .WithOne()
    .HasForeignKey(x => x.AuthenticationId);

И нет, вам не нужно присваивать каждой сущности уникальное имя столбца ID. Фактически, вы можете вызывать что угодно в своем коде и переименовывать его в конфигурации:

modelBuilder.Entity<User>()
    .Property(x => x.Id).HasColumnName("WHATEVER_YOU_WANT_TO_CALL_IN_DB");
0 голосов
/ 17 марта 2019

Вам нужно поставить внешний ключ на другой класс. Похоже, у вас нет свойства «Authentication_Id» в классе Authentication.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...