使用带有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属性在做什么?