Как определить отношение внешнего ключа в EF Core 2.1 - PullRequest
0 голосов
/ 08 декабря 2018

Я использую EF Core 2.1 для моего DAL.Вот так выглядит моя модель

Один пользователь может иметь только одну роль:

// Role entity - kind of master
public class Role
{
    public int RoleId { get; set; }

    public string RoleName { get; set; }
}

// User entity - every user will have one role
public class User
{
    public int UserId { get; set; }

    public string Email { get; set; }
    public string Password { get; set; }

    public int RoleId { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreatedOn { get; set; }

    public virtual Role Role { get; set; }
}

Вот как я думал / пытался определить отношения между этими двумя сущностями:

public void Configure(EntityTypeBuilder<User> builder)
{
    builder.HasKey(x => x.UserId);
    builder.Property(x => x.RoleId).IsRequired(true);
    builder.Property(x => x.CreatedOn).IsRequired(true).HasDefaultValue(DateTime.Now);

    // FK - throwing compile time error 
    builder.HasOne(x => x.Role).WithOne(y => y.RoleId);
}

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

Спасибо.

Приложение: - enter image description here

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Не только в конфигурации отношений FK, у вас также есть проблема в конфигурации генерации значений по умолчанию для столбца CreatedOn.Поэтому напишите свою конфигурацию сущности следующим образом:

public void Configure(EntityTypeBuilder<User> builder)
{
    builder.HasKey(u => u.UserId);
    builder.Property(u => u.CreatedOn).IsRequired(true).HasDefaultValueSql("getdate()");

    // FK - configuraiton
    builder.HasOne(u => u.Role).WithMany().HasForeignKey(u => u.RoleId).IsRequired(true);
}
0 голосов
/ 08 декабря 2018

Одним из принципов, на которых построена платформа Entity, является «Соглашение по конфигурации», и по соглашению я не думаю, что builder.HasOne(x => x.Role).WithOne(y => y.RoleId); необходимо, поскольку по соглашению вы уже заявили, что ваша сущность User должна иметь только одну роль при добавленииpublic int RoleId { get; set; } и public virtual Role Role { get; set; } свойства.Удалите это, и я уверен, что ваше приложение приведет к такому поведению, как указано в моем комментарии выше.

0 голосов
/ 08 декабря 2018

Я думаю, что вы можете добавить пользователей к роли следующим образом

public class Role
{
    public int RoleId { get; set; }

    public string RoleName { get; set; }
    public List<User> Users {get;set;}
}

Тогда вы зарегистрируетесь вот так

public void Configure(EntityTypeBuilder<User> builder)
{
    builder.HasKey(x => x.UserId);
    builder.Property(x => x.RoleId).IsRequired(true);
    builder.Property(x => x.CreatedOn).IsRequired(true).HasDefaultValue(DateTime.Now);


    builder.HasOne(x => x.Role).WithMany(y => y.Users);
}
...