Я играл с .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-столбца?Как мне перейти к абстрактной сущности, у которой все производные классы наследуют столбец идентификатора?