我有以下数据库表:
ID ParentID LinksTo
---------------------
0 null "1,2"
1 0 "0,2"
2 0 "1"
它是一种分层设计,每个记录都指向同一个表中的父记录。我知道LinksTo字段是一个非常糟糕的设计,但是给出了表,我无法改变它。 (请注意,LinksTo字段会创建一种多对多关系。)
使用Code-First EF,我有以下模型类:
public class Item
{
public int ID { get; set; }
public int ParentID { get; set; }
public string LinksTo { get; set; }
public virtual Item Parent { get; set; }
[InverseProperty("Parent")]
public virtual ICollection<Item> Children { get; set; }
}
现在,我如何向模型添加动态属性,以便我可以在代码中访问Item集合Item.LinksTo和Item.LinksFrom(反向)?
答案 0 :(得分:1)
我想我会做这样的事情:
private List<Item> _linkedItems;
private void UpdateLinksTo() {
this.LinksTo = string.Join<string>(_linkedItems.Select(i => i.ID.ToString()));
}
[NotMapped]
public ReadOnlyCollection<Item> LinkedItems {
get {
if(_linkedItems == null) {
_linkedItems = db.Items.Where(i => this.LinksTo.Split(',').Select(x => int.Parse(x)).Contains(i.ID)).ToList();
}
return _linkedItems.AsReadOnly();
}
}
[NotMapped]
public void AddLinkedItem(Item item) {
if(!_linkedItems.Select(i => i.ID).Contains(item.ID)) {
_linkedItems.Add(item);
UpdateLinksTo();
}
}
这将允许您访问一个只读集合,其中包含可以改变它的方法(您也可以创建一个DeleteLinkedItem方法),这个方法与我想要做的一样好。
我还没检查过,看看是否编译,顺便说一句。