[英]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:
如果要在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.