将链接字段动态添加到 ASP.NET MVC EF 模型
Dynamically add a linked field to an ASP.NET MVC EF model
我有以下数据库table:
ID ParentID LinksTo
---------------------
0 null "1,2"
1 0 "0,2"
2 0 "1"
这是一种分层设计,其中每个记录都指向同一 table 中的父记录。我知道 LinksTo 字段是一个非常糟糕的设计,但是 table 已经给出,我无法更改它。 (请注意,LinksTo 字段创建了一种多对多关系。)
使用代码优先 EF,我有以下模型 class:
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.LinksTo 和 Item.LinksFrom(相反)?
我想我会这样做:
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 方法),这与我认为的一样好。
顺便说一句,我什至都没有检查过是否可以编译。
我有以下数据库table:
ID ParentID LinksTo
---------------------
0 null "1,2"
1 0 "0,2"
2 0 "1"
这是一种分层设计,其中每个记录都指向同一 table 中的父记录。我知道 LinksTo 字段是一个非常糟糕的设计,但是 table 已经给出,我无法更改它。 (请注意,LinksTo 字段创建了一种多对多关系。)
使用代码优先 EF,我有以下模型 class:
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.LinksTo 和 Item.LinksFrom(相反)?
我想我会这样做:
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 方法),这与我认为的一样好。
顺便说一句,我什至都没有检查过是否可以编译。