EF Core 无法确定抽象的外键表示的关系 class
EF Core unable to determine relationship represented by foreign keys in abstract class
我正在尝试为包含两个对用户 class 的引用的 CRUD 对象实现抽象 class;一个用于创建对象的用户,另一个用于最后修改它的用户。 Entity framework 无法确定继承它们(部门)的 class 上的 CreatedBy 和 ModifiedBy 导航属性所表示的关系。一个潜在的额外并发症是用户 class 也有一个 属性 的 class 部门,这与部门的 CreatedBy 和 ModifiedBy 属性无关。
错误信息如下:
无法确定类型 'User' 的导航 属性 'Department.CreatedBy' 表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用 'OnModelCreating'.
中的 'EntityTypeBuilder.Ignore' 忽略此 属性
我正在使用 dotnet 3.0 和 EF Core 3.0
我尝试了 ForeignKey 数据属性的各种配置,并按照 EF 文档使用 Fluent API,但我无法让它们工作。
public class User
{
[Key]
public int Id { get; set; }
public Department Department { get; set; } = null!;
}
public class Department : AbstractCrudObject
{
}
public abstract class AbstractCrudObject
{
[Key]
public int Id { get; set; }
[ForeignKey("CreatedByUserId")]
public User CreatedBy { get; set; } = null!;
public int CreatedByUserId { get; set; }
[ForeignKey("ModifiedByUserId")]
public User ModifiedBy { get; set; } = null!;
public int ModifiedByUserId { get; set; }
}
public class AppDbContext : DbContext
{
public virtual DbSet<User> Users { get; set; } = null!;
public virtual DbSet<Department> Departments { get; set; } = null!;
public AppDbContext()
{
}
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
A potential additional complication is that the User class also has a property of class Department, which is unrelated to the CreatedBy and ModifiedBy properties on Department.
这就是问题所在 - EF Core 不知道它们是不相关的,还是与其中之一(以及哪一个)相关,因此您必须使用流畅的 API 显式配置它。
最低限度是指定所需关系的多重性和导航属性 - 在这种情况下,3 个多对一关系在依赖端具有参考导航 属性 并且没有集合导航 属性 在主体端:
modelBuilder.Entity<User>()
.HasOne(e => e.Department)
.WithMany();
modelBuilder.Entity<Department>()
.HasOne(e => e.CreatedBy)
.WithMany();
modelBuilder.Entity<Department>()
.HasOne(e => e.ModifiedBy)
.WithMany();
我正在尝试为包含两个对用户 class 的引用的 CRUD 对象实现抽象 class;一个用于创建对象的用户,另一个用于最后修改它的用户。 Entity framework 无法确定继承它们(部门)的 class 上的 CreatedBy 和 ModifiedBy 导航属性所表示的关系。一个潜在的额外并发症是用户 class 也有一个 属性 的 class 部门,这与部门的 CreatedBy 和 ModifiedBy 属性无关。
错误信息如下:
无法确定类型 'User' 的导航 属性 'Department.CreatedBy' 表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用 'OnModelCreating'.
中的 'EntityTypeBuilder.Ignore' 忽略此 属性我正在使用 dotnet 3.0 和 EF Core 3.0
我尝试了 ForeignKey 数据属性的各种配置,并按照 EF 文档使用 Fluent API,但我无法让它们工作。
public class User
{
[Key]
public int Id { get; set; }
public Department Department { get; set; } = null!;
}
public class Department : AbstractCrudObject
{
}
public abstract class AbstractCrudObject
{
[Key]
public int Id { get; set; }
[ForeignKey("CreatedByUserId")]
public User CreatedBy { get; set; } = null!;
public int CreatedByUserId { get; set; }
[ForeignKey("ModifiedByUserId")]
public User ModifiedBy { get; set; } = null!;
public int ModifiedByUserId { get; set; }
}
public class AppDbContext : DbContext
{
public virtual DbSet<User> Users { get; set; } = null!;
public virtual DbSet<Department> Departments { get; set; } = null!;
public AppDbContext()
{
}
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
A potential additional complication is that the User class also has a property of class Department, which is unrelated to the CreatedBy and ModifiedBy properties on Department.
这就是问题所在 - EF Core 不知道它们是不相关的,还是与其中之一(以及哪一个)相关,因此您必须使用流畅的 API 显式配置它。
最低限度是指定所需关系的多重性和导航属性 - 在这种情况下,3 个多对一关系在依赖端具有参考导航 属性 并且没有集合导航 属性 在主体端:
modelBuilder.Entity<User>()
.HasOne(e => e.Department)
.WithMany();
modelBuilder.Entity<Department>()
.HasOne(e => e.CreatedBy)
.WithMany();
modelBuilder.Entity<Department>()
.HasOne(e => e.ModifiedBy)
.WithMany();