【问题标题】:How can I map a base entity field to different columns for each subclass如何将基本实体字段映射到每个子类的不同列
【发布时间】: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


    【解决方案1】:

    我无法获得以上代码来编译或给出异常,因为您在尝试修复它后获得了足够的信息。虽然我将描述如何编写您尝试实现的场景。

    如果您想在 EF 中使用EntityBase.Id 作为 PK 属性,您需要将其设为公共属性。在您的代码中,它是一个私有字段(因为没有 get/set 方法)。所以你的EntityBase 类应该是这样的

    public class EntityBase
    {
        public int Id { get; set; }
    }
    

    通过上述更改和OnModelCreating 代码来映射所发布的实体类型,模型构建可以正确地创建具有所需表结构和名称的表。

    以下是在 dbset 上实现通用 GetById 的小方法。它可以成为通用存储库甚至扩展方法的一部分。

    public static T GetById<T>(DbSet<T> dbset, int id)
        where T : EntityBase
    {
        return dbset.FirstOrDefault(e => e.Id == id);
    }
    
    // example
    var entity = GetById(db.Set<IdEntity>(), 2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 2020-06-09
      • 1970-01-01
      • 2020-10-27
      • 2021-07-23
      • 2020-10-24
      • 2017-10-16
      • 2021-01-16
      相关资源
      最近更新 更多