【发布时间】:2017-04-06 16:06:43
【问题描述】:
我有一个基实体类,我希望能够继承它,因此我只需为许多不同的实体特定存储库编写 1 个GetById 方法。但是,由于遗留原因,我的某些数据库表中的“Id”列必须称为“代码”。
我尝试过(简化版):
public class EntityBase{
int Id;
}
public class IdEntity : EntityBase{
}
public class CodeEntity : EntityBase{
}
然后在 DbContext 中:
modelBuilder.Entity<IdEntity>(entity =>
{
entity.HasKey(e=>e.Id).HasName("PK_IdEntity");
entity.Property(e=>e.Id).HasColumnName("ID");
}
modelBuilder.Entity<CodeEntity>(entity =>
{
entity.HasKey(e=>e.Id).HasName("PK_CodeEntity");
entity.Property(e=>e.Id).HasColumnName("Code"); //this seems to be where it breaks
}
这构建得很好,但是当我尝试运行它时,我得到了一个 InvalidOperationException: 无法调用实体类型“CodeEntity”上的属性“Id”的属性,因为它被配置为导航属性。属性只能用于配置标量属性。
我想做的事是不可能的吗?这对我来说似乎不太可能,但是正确的方法是什么?
编辑:
我实际尝试做的事情比我在此处发布的“简化”代码要复杂得多。我想这样做,所以我可以有一个字符串或整数 ID,并使用相同的 GetById 方法。所以我创建了一个隐式转换为 string 和 int 的类,我认为这对于 Entity Framework 来说是可以的。
不是。
运行时错误是由于试图告诉 EF 类型为 EntityID 的属性应该是我的密钥而导致的,这是不允许的。
我找不到任何来自 Microsoft 的关于实体框架中键值要求的文档,但我发现另一个 SO 问题说键只允许使用标量和字节 []:Type safe keys with Entity Framework model
【问题讨论】:
标签: c# asp.net-core entity-framework-core ef-fluent-api