簡體   English   中英

EF 4.1通用多對多關系

[英]EF 4.1 Generic Many-To-Many relationship

需要在EF 4.1中構建各種標記系統,該系統允許查詢每個標記的所有實體或每個實體的所有標記。 這是我的模型的簡要快照:

public abstract class BaseEntity {

    [Required]
    [Key]
    public Guid ID { get; set; }
}

public class Tag : BaseEntity {
    // tag subscribers
    public List<King> Kings { get; set; }
    public List<Knight> Knights { get; set; }
    public List<Peasant> Peasants { get; set; }
}

public class King : BaseEntity {
    public string Title { get; set; }
    public List<Tag> Tags { get; set; }
}

public class Knight : BaseEntity {
    public string Title { get; set; }
    public List<Tag> Tags { get; set; }
}

public class Peasant : BaseEntity {
    public string Title { get; set; }
    public List<Tag> Tags { get; set; }
}

(是的,我知道國王,騎士和農民在這里是相同的。但是正如信使在《蒙蒂蟒蛇》和《聖杯》中所說:“這只是一個模型。”)

因此,無論如何,該模型都可以很好地工作,但是我更喜歡T泛型列表,而不是特定的類型轉換。 數據庫中的表更少,從標簽查詢到實體時的開銷也更少。 如何將Tag中的所有List <Entity>屬性轉換為單個通用List <T>,其中T:BaseEntity,這是否會導致我可以查詢單個查找表以查找特定派生類? 就像是:

 List<Knight> knightsByTag = Tags.Where(t => t.GetType() == typeof (Knight)).ToList();

編輯:是的。 抱歉,那里還有一些實際代碼。

@DarthVader:

  • 希望Tag使用一個List屬性而不是當前的三個List屬性。
  • 希望能夠查詢與騎士相關聯的所有標簽,或與標簽相關聯的所有農民,等等。
  • 想要確保EF CodeFirst能夠准確地解析通用列表,最好使用查找表。

如果要在BaseEntity具有單個列表,則還必須將列表放在子實體中。 您將以類似以下內容結束:

public abstract class BaseEntity {
    ...

    // tags
    public List<Tag> Tags { get; set; }
}

public class Tag : BaseEntity {
    ...

    // tag subscribers
    public List<BaseEntity> Entities { get; set; }
}

如果您有任何特定的約束,則必須先在應用程序中檢查它們,然后再建立實體和標記之間的關系。 任何其他方式都會導致您為每個實體分離導航屬性,並為這種關系分離連接表。

與騎士相關的所有標簽-這應該起作用:

var tags = from k in context.Knights // or context.BaseEntities.OfType<Knight>()
           from t in k.Tags
           select t;

與標簽相關聯的所有農民-這應該起作用:

var peasants = from t in context.Tags
               from p in t.Entities.OfType<Peasant>()
               select p;

注意映射繼承對查詢性能有負面影響。

暫無
暫無

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

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