EF核心数据注释和Fluent配置差异

时间:2020-03-03 15:39:17

标签: c# sql-server entity-framework .net-core data-annotations

使用带有SQL Server(2.2.6)的EF Core,我发现有一种方法可以对数据进行注释,而不能进行流畅的配置。

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类,然后尝试从上下文中的Departments DbSet查找会导致错误:

“无效的列名'DefaultRoleRoleID'”

删除DataAnnotation,但添加

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

意味着我现在可以查询和更新,但是如果尝试创建,则会收到错误消息:

“实体类型'Role'的属性'RoleID'是键的一部分,因此 无法修改或标记为已修改。更改本金 具有标识外键的现有实体首先删除 依赖项并调用“ SaveChanges”,然后将依赖项与 新的校长。”

我不是要添加新角色,而是要引用现有角色。创建新的Role实例,还是从数据库检索它并将其分配给Department实例都没有关系,错误是相同的。尽管在部门上引用角色的方式相同,但公司没有等效错误。我能辨别的唯一区别是,Entity Framework无法正确推断外键列上的Role的影子属性名称,这与Company一样。在流畅的配置中我无法实现的DataAnnotations.Schema.ForeignKey属性在做什么?

0 个答案:

没有答案