【发布时间】:2020-09-23 00:36:21
【问题描述】:
我有一个基类Foo,其中包含我在我的应用程序中需要的所有属性。 ui 使用具有必要 ui 属性的派生类 (FooUi)。例如,数据库使用具有Id 属性的派生类 (FooEntity)。但这似乎是问题的症结所在,因为根据例外情况,这在EF core 中可能是不允许的。这里是否有一个优雅的解决方案,这样我就不必在我的基类中打包 Id 属性,因为我在其他任何地方都不需要它并且仍然有可能拥有密钥?
public class Foo
{
}
public class FooEntity : Foo
{
public int Id { get; set; }
}
public class FooDbContext : DbContext
{
public DbSet<FooEntity> Foos { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<FooEntity>(builder =>
{
builder.ToTable("Foos");
// here the exception occurs
builder.HasIndex(entity => entity.Id);
});
base.OnModelCreating(modelBuilder);
}
}
例外
无法在“FooEntity”上配置键,因为它是派生类型。必须在根类型“Foo”上配置密钥。如果您不打算将“Foo”包含在模型中,请确保它不包含在上下文的 DbSet 属性中、在对 ModelBuilder 的配置调用中引用或从包含的类型的导航属性中引用在模型中。
【问题讨论】:
-
你的目标是什么?为什么需要这样的基类?通常将数据访问模型与其他(尤其是 UI)模型混合是自找麻烦。
-
我的目标是拥有一个尽可能精简的基类,一方面避免重复代码,另一方面,模型始终相互兼容,因为所有属性都是制服。例如,我不需要 ID,因为它只与数据库相关,而 UI 中不需要。
标签: c# entity-framework entity-framework-core