首页 > 解决方案 > 如何忽略继承中的歧视列

问题描述

我的系统有一个定制,他们使用相同的数据库,但定制有一些主系统不知道的自己的表。

我的主系统中有这个实体:

[Table("WORKFLOW_ITEM")]
public class WORKFLOW_ITEM
{
    public WORKFLOW_ITEM()
    {
        PROJECT = new HashSet<PROJECT>();
        WORKFLOW_HISTORY = new HashSet<WORKFLOW_HISTORY>();
    }

    [Key]
    public long ID_WORKFLOW_ITEM { get; set; }

    public long ID_WORKFLOW { get; set; }

    public virtual WORKFLOW WORKFLOW { get; set; }

    public virtual ICollection<WORKFLOW_HISTORY> WORKFLOW_HISTORY { get; set; }
    public virtual ICollection<PROJECT> PROJECT { get; set; }
}

在我的自定义系统中,我需要扩展以实现这个新集合

[Table("WORKFLOW_ITEM")]
public class WORKFLOW_ITEMCUSTOM : WORKFLOW_ITEM
{
    public WORKFLOW_ITEMCUSTOM() 
    {
        ENGINEERING_REQUEST = new HashSet<ENGINEERING_REQUEST>();
    }

    public virtual ICollection<ENGINEERING_REQUEST> ENGINEERING_REQUEST { get; set; }
}

public class ENGINEERING_REQUEST
{
    [Key]
    public long ID_ENGINEERING_REQUEST { get; set; }

    public long? ID_WORKFLOW_ITEM { get; set; }
    public virtual WORKFLOW_ITEMCUSTOM WORKFLOW_ITEM { get; set; }
}

我的上下文

public class ContextCUSTOM: MyContext
{
    public ContextCUSTOM(string p_ConnectionString) :
        base(p_ConnectionString) { }

    public virtual DbSet<ENGINEERING_REQUEST> ENGINEERING_REQUEST { get; set; }
    public virtual DbSet<WORKFLOW_ITEMCUSTOM> WORKFLOW_ITEMCUSTOM{ get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<ENGINEERING_REQUEST>()
            .HasOne(ct => ct.WORKFLOW_ITEM)
            .WithMany(ct => ct.ENGINEERING_REQUEST)
            .HasForeignKey(ct => ct.ID_WORKFLOW_ITEM)
            .OnDelete(DeleteBehavior.Restrict);
    }
}

当我尝试在这种情况下运行查询时,我收到一个关于鉴别器列的运行时错误,但我不想使用类似层次结构,只需要组合来添加更多虚拟对象。有什么解决办法吗?

标签: c#.netentity-framework-core

解决方案


如果有可能,您可以尝试为WORKFLOW_ITEMand引入基类WORKFLOW_ITEMCUSTOM

public abstract class WORKFLOW_ITEM_BASE
{
    public WORKFLOW_ITEM_BASE()
    {
        PROJECT = new HashSet<PROJECT>();
        WORKFLOW_HISTORY = new HashSet<WORKFLOW_HISTORY>();
    }

    [Key]
    public long ID_WORKFLOW_ITEM { get; set; }

    public long ID_WORKFLOW { get; set; }

    public virtual WORKFLOW WORKFLOW { get; set; }

    public virtual ICollection<WORKFLOW_HISTORY> WORKFLOW_HISTORY { get; set; }
    public virtual ICollection<PROJECT> PROJECT { get; set; }
}

[Table("WORKFLOW_ITEM")]
public class WORKFLOW_ITEM: WORKFLOW_ITEM_BASE {}

[Table("WORKFLOW_ITEM")]
public class WORKFLOW_ITEMCUSTOM : WORKFLOW_ITEM_BASE
{
    public WORKFLOW_ITEMCUSTOM() 
    {
        ENGINEERING_REQUEST = new HashSet<ENGINEERING_REQUEST>();
    }

    public virtual ICollection<ENGINEERING_REQUEST> ENGINEERING_REQUEST { get; set; }
}

推荐阅读