首页 > 解决方案 > CodeFirst EF Core - 可以实现接口吗?

问题描述

我对 EF Core 中的代码优先有点陌生,我正在尝试一些事情,我有点困惑如何实现以下内容(或者实际上是否可以实现)。

在我的模型中,我有一个将实体映射到案例的类,具有以下映射类

public class CaseEntity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CaseEntityId { get; set; }
    
    public int CaseId { get; set; }
    public CaseModel Case { get; set; }
    public Guid EntityId { get; set; }
    public EntityModel Entity { get; set; }
}

我现在正在实现该EntityModel对象。但是,实体可以是 aPerson或 a Company。这两者都有共同的属性,但也有一些自然的差异。我想做的是创建一个IEntityModel接口和两个类,如下所示

public class CaseEntity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CaseEntityId { get; set; }
    
    public int CaseId { get; set; }
    public CaseModel Case { get; set; }
    public Guid EntityId { get; set; }
    public IEntityModel Entity { get; set; }
}

public interface IEntityModel
{
    Guid EntityId { get; set; }
    PostalAddress PrincipalAddress { get; set; }
}

public class CompanyEntity : IEntityModel
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid EntityId { get; set; }
    public string CompanyName { get; set; }
    public PostalAddress PrincipalAddress { get; set; }
}

public class PersonEntity : IEntityModel
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid EntityId { get; set; }
    public PostalAddress PrincipalAddress { get; set; }
    public string FirstNames { get; set; }
    public string Surname { get; set; }
}

当我尝试构建它时,我得到了错误

属性“CaseEntity.Entity”属于接口类型(“IEntityModel”)。如果是导航,请手动配置此属性的关系,方法是将其转换为映射的实体类型。

否则,使用“OnModelCreating”中的 [NotMapped] 属性或“EntityTypeBuilder.Ignore”忽略该属性。

我不是 100% 确定我能做我想做的事。四处搜索让我有点困惑(这是实现类似功能的解决方案,还是我应该使用实现具有支持 aCompany或 a所需的所有属性的实体类Person?)

标签: c#interfaceentity-framework-coreef-code-first-mapping

解决方案


我认为如果你创建一个基类会更好

public class EntityModel:IEntityModel
{
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public  int EntityId { get; set; }
   publlic  PostalAddress PrincipalAddress { get; set; }
}

公司实体

public class CompanyEntity : EntityModel
{
    public string CompanyName { get; set; }
}

案例实体

public class CaseEntity
    
    {
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CaseEntityId { get; set; }
    
    
    public int CaseId { get; set; }
    public CaseModel Case { get; set; }

    public int EntityId { get; set; }
    public virtual EntityModel EntityModel { get; set; }
    }

推荐阅读