簡體   English   中英

實體框架6:兩個不相關的實體映射到同一張表

[英]Entity Framework 6: Two unrelated entities mapped to same table

我想將一個表映射到兩個不相關的實體:EntityBasic和EntityAdvanced。 EntityAdvanced具有此功能不需要的其他業務邏輯,我想創建一個僅包含表中字段的新Entity。

MyTable的:

MyTableId : Guid
ParentId : Guid
Name : string
Description : string
Type : int

EntityBasic:

[Table("MyTable")]
public class EntityBasic
{
    [Key]
    public Guid MyTableId { get; set; }

    public Guid ParentId { get; set }

    public string Name { get; set; }

    public string Description { get; set; }

    public int Type { get; set; }

    [ForeignKey("ParentId")]
    public virtual List<EntityBasic> Entities{ get; set; }
}

EntityAdvanced:

[Table("MyTable")]
public class EntityAdvanced
{
    private List<EntityAdvanced> _entities;
    private List<Filter> _filters;

    [Key]
    public Guid MyTableId { get; set; }

    public Guid ParentId { get; set }

    public string Name { get; set; }

    public string Description { get; set; }

    public int Type { get; set; }

    [ForeignKey("ParentId")]
    public virtual List<EntityAdvanced> Entities
    {
        get { //Some complicated getter }
        set { //Some complicated setter }
    }

    [NotMapped]
    public string ImageUrl
    {
        get { //Some complicated getter }
        set { //Some complicated setter }
    }

    public void SetFilters(//Some parameters)
    {
        //Some logic 
    }
}

當我這樣做時,我得到這個錯誤:

實體類型“ EntityAdvanced”和“ EntityBasic”不能共享表“ MyTable”,因為它們不在同一類型層次結構中,或者沒有有效的一對一外鍵關系且它們之間具有匹配的主鍵。

有什么方法可以做我想要的嗎?

首先,您的EntityAdvanced應該繼承EntityBasic,因為它們共享相同的基本屬性集。 您無需重寫它們。 請注意extends EntityBasic

[Table("MyTable")]
public class EntityBasic
{
    [Key]
    public Guid MyTableId { get; set; }

    public Guid ParentId { get; set }

    public string Name { get; set; }

    public string Description { get; set; }

    public int Type { get; set; }

    [ForeignKey("ParentId")]
    public virtual List<EntityBasic> Entities{ get; set; }
}

[NotMapped]
public class EntityAdvanced : EntityBasic
{    
    //[NotMapped]
    public string ImageUrl
    {
        get { //Some complicated getter }
        set { //Some complicated setter }
    }

    public void SetFilters(//Some parameters)
    {
        //Some logic 
    }
}

使用繼承, List<EntityBasic> Entities可以引用EntityAdvanced對象,因此您不再需要聲明:

[ForeignKey("ParentId")]
public virtual List<EntityAdvanced> Entities
{
    get { //Some complicated getter }
    set { //Some complicated setter }
}

您可以在此處獲得有關使用Entity Framework實現繼承的有用信息。

編碼愉快!

我認為您可以使用Entity Framework 6的“表拆分”功能,在此處查看示例: https : //www.c-sharpcorner.com/UploadFile/ff2f08/table-splitting-in-entity-framework- 6-代碼優先的方法/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM