将链接字段动态添加到 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 方法),这与我认为的一样好。

顺便说一句,我什至都没有检查过是否可以编译。