EF Core 是否支持通用的抽象基础实体?
Does EF Core support an abstract base entity which is generic?
我记得以前的 EF 中的通用实体存在问题。 EF 核心怎么样?我找不到与此事相关的文档。
例如:
public abstract class Parent<TEntity> {
public int EntityId { get; set; }
public TEntity Entity { get; set; }
}
public class Child : Parent<Foo> {
}
public class OtherChild : Parent<Bar> {
}
// config for child entities includes this:
config.HasKey(c => c.EntityId);
虽然这表明子实体没有定义主键,但显然它们定义了主键!
我可以通过使 Parent
成为非泛型来解决这个问题。
有这方面的官方文档吗?我做错了什么,还是这是预期的行为?
我可以在 ef-core 1.1.0 中使用这个模型:
public abstract class Parent<TEntity>
{
public int EntityId { get; set; }
public TEntity Entity { get; set; }
}
public class Child : Parent<Foo>
{
}
public class OtherChild : Parent<Bar>
{
}
public class Foo
{
public int Id { get; set; }
}
public class Bar
{
public int Id { get; set; }
}
在上下文中使用此映射:
protected override void OnModelCreating(ModelBuilder mb)
{
mb.Entity<Child>().HasKey(a => a.EntityId);
mb.Entity<Child>().HasOne(c => c.Entity).WithMany().HasForeignKey("ParentId");
mb.Entity<OtherChild>().HasKey(a => a.EntityId);
mb.Entity<OtherChild>().HasOne(c => c.Entity).WithMany().HasForeignKey("ParentId");
}
这导致了这个奇妙的模型:
我记得以前的 EF 中的通用实体存在问题。 EF 核心怎么样?我找不到与此事相关的文档。
例如:
public abstract class Parent<TEntity> {
public int EntityId { get; set; }
public TEntity Entity { get; set; }
}
public class Child : Parent<Foo> {
}
public class OtherChild : Parent<Bar> {
}
// config for child entities includes this:
config.HasKey(c => c.EntityId);
虽然这表明子实体没有定义主键,但显然它们定义了主键!
我可以通过使 Parent
成为非泛型来解决这个问题。
有这方面的官方文档吗?我做错了什么,还是这是预期的行为?
我可以在 ef-core 1.1.0 中使用这个模型:
public abstract class Parent<TEntity>
{
public int EntityId { get; set; }
public TEntity Entity { get; set; }
}
public class Child : Parent<Foo>
{
}
public class OtherChild : Parent<Bar>
{
}
public class Foo
{
public int Id { get; set; }
}
public class Bar
{
public int Id { get; set; }
}
在上下文中使用此映射:
protected override void OnModelCreating(ModelBuilder mb)
{
mb.Entity<Child>().HasKey(a => a.EntityId);
mb.Entity<Child>().HasOne(c => c.Entity).WithMany().HasForeignKey("ParentId");
mb.Entity<OtherChild>().HasKey(a => a.EntityId);
mb.Entity<OtherChild>().HasOne(c => c.Entity).WithMany().HasForeignKey("ParentId");
}
这导致了这个奇妙的模型: