EF Core DataAnnotation и несоответствие конфигурации Fluent - PullRequest
0 голосов
/ 03 марта 2020

Использование EF Core с / 1023 * сервером (2.2.6), и я обнаружил, что есть способ сделать что-то с аннотацией данных, но не с быстрой конфигурацией.

public class Department
{
    public int DepartmentID { get; set; }
    public Company Company { get; set; }
    [ForeignKey("DefaultRoleID")]
    public Role DefaultRole { get; set; }
    public string DepartmentName { get; set; }
}

public class Company
{
    public int CompanyID { get; set; }
    public string CompanyName { get; set; }
}

public class Role
{
    public int RoleID { get; set; }
    public Company Company { get; set; }
    public string RoleName { get; set; }
}

public class DepartmentEntityConfiguration : IEntityTypeConfiguration<Department>
{
    public void Configure(EntityTypeBuilder<Department> builder)
    {
        builder.ToTable("Department");
        builder.HasKey(e => e.DepartmentID);

        builder.HasOne<Company>(e => e.Company);
        builder.HasOne<Role>(e => e.DefaultRole);
            //.WithOne()
            //.HasForeignKey<Role>(f => f.RoleID);
    }
}

public class CompanyEntityConfiguration : IEntityTypeConfiguration<Company>
{
    public void Configure(EntityTypeBuilder<Company> builder)
    {
        builder.ToTable("Company");
        builder.HasKey(e => e.CompanyID);
    }
}

public class RoleEntityConfiguration : IEntityTypeConfiguration<Role>
{
    public void Configure(EntityTypeBuilder<Role> builder)
    {
        builder.ToTable("Role");
        builder.HasKey(e => e.RoleID);

        builder.HasOne<Company>(e => e.Company);
    }
}

Если я удалите

[ForeignKey("DefaultRoleID")]

из класса Department, затем попытка найти из DbSet из отдела в контексте приводит к ошибке:

"Неверное имя столбца 'DefaultRoleRoleID'"

с удалением DataAnnotation, но добавление

.WithOne()
.HasForeignKey<Role>(f => f.RoleID);

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

"Свойство 'RoleID' для типа объекта 'Роль' является частью ключа и поэтому не может быть изменено или помечено как измененное. Чтобы изменить принципал существующего объекта с идентифицирующим внешним ключом, сначала удалите зависимый и вызовите Затем SaveChanges связывает зависимого с новым принципалом. "

Я не пытаюсь добавить новую роль, просто ссылку на существующую. Не имеет значения, создаю ли я новый экземпляр Role или извлекаю его из БД и назначаю его экземпляру Department, ошибка та же. Для Компании нет эквивалентной ошибки, несмотря на то, что на нее ссылаются в Департаменте так же, как и на роль. Единственное отличие, которое я могу различить, это то, что имя свойства тени в роли не может быть правильно экстраполировано Entity Framework для столбца внешнего ключа, как это может сделать для компании. Что делает атрибут DataAnnotations.Schema.ForeignKey, чего я не могу достичь в текущей конфигурации?

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