Использование 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, чего я не могу достичь в текущей конфигурации?