动态地将链接字段添加到ASP.NET MVC EF模型

时间:2015-01-29 09:29:47

标签: c# asp.net-mvc entity-framework model ef-code-first

我有以下数据库表:

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(反向)?

1 个答案:

答案 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方法),这个方法与我想要做的一样好。

我还没检查过,看看是否编译,顺便说一句。