【问题标题】:Using Inherited Entity Class in asp.net EF Core在 asp.net EF Core 中使用继承的实体类
【发布时间】:2023-02-04 06:25:11
【问题描述】:

我有以下实体类(直接映射到 SQL Server 数据库表)

public class PROCESSCARD : BaseClass
    {
        [Key]
        [Display(Name = "Card No")]
        public String ProcessCardID { get; set; }
        [Display(Name = "Entry Date")]
        public DateTime EntryDate { get; set; }

        [Display(Name ="Job Type")]
        public String JobType { get; set; }

        [Display(Name = "Job / Non Job")]
        public String JobNonJob { get; set; }

        [Display (Name = "Cost Booking")]
        public String CostBooking { get; set; }

        [Display(Name = "Planned Hrs/Qty")]
        public Decimal? PlannedHours { get; set; }
}

上面的类继承自 BaseClass 如下

public class BaseClass
    {
        [NotMapped]
        public String StatusMessage { get; set; }
    }

现在到此为止没有问题,一切都很好, 但我正在将实体 PROCESSCARD 的已删除数据存储到 PROCESSCARD_HIST,并且我想向用户显示已删除的历史数据。 两个实体的结构(PROCESSCARD 和 PROCESSCARD_HIST 相同)所以我创建了另一个实体类 PROCESSCARD_HIST,为了避免重复成员,我从 PROCESSCARD 继承了 PROCESSCARD_HIST,

public class PROCESS_CARD_HIST : PROCESS_CARD
        {
    
        }

但是现在当我尝试从 PROCESSCARD_HIST 类访问数据时,它会抛出类似“无效的列名‘鉴别器’”的错误, 知道我如何实现这一目标吗?

【问题讨论】:

  • 您的数据库 DTO 不是您的业务模型实体。 ORM 中的继承意味着表之间的关系 - 1) 同一个表中的所有子类型都带有鉴别器列 2) 所有类型都在单独的表中或 3) 一个表中的基本类型和每个类型单独表中的所有额外列

标签: entity-framework asp.net-core entity-framework-core


【解决方案1】:

如果不想重复两个类中的属性,引入另一个未映射的超类

    public class ProcessCardBase : BaseClass
    {
        [Key]
        [Display(Name = "Card No")]
        public String ProcessCardID { get; set; }
        [Display(Name = "Entry Date")]
        public DateTime EntryDate { get; set; }

        [Display(Name ="Job Type")]
        public String JobType { get; set; }

        [Display(Name = "Job / Non Job")]
        public String JobNonJob { get; set; }

        [Display (Name = "Cost Booking")]
        public String CostBooking { get; set; }

        [Display(Name = "Planned Hrs/Qty")]
        public Decimal? PlannedHours { get; set; }
}

然后

public class ProcessCard : ProcessCardBase
{
    
}

public class ProcessCardHistory : ProcessCardBase
{
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2022-01-25
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多