C# 向ASP.NET MVC EF模型动态添加链接字段

C# 向ASP.NET MVC EF模型动态添加链接字段,c#,asp.net-mvc,entity-framework,model,ef-code-first,C#,Asp.net Mvc,Entity Framework,Model,Ef Code First,我有以下数据库表: ID ParentID LinksTo ----------- 0空1,2 1 0 0,2 2 0 1 这是一种分层设计,其中每个记录指向同一表中的父记录。我知道LinksTo字段是一个非常糟糕的设计,但是表是给定的,我无法更改它。请注意,LinksTo字段创建了一种多对多关系 使用代码优先EF,我有以下模型类: 公共类项目 { 公共int ID{get;set;} public int ParentID{get;set;} 公共字符串

我有以下数据库表:

ID ParentID LinksTo ----------- 0空1,2 1 0 0,2 2 0 1 这是一种分层设计,其中每个记录指向同一表中的父记录。我知道LinksTo字段是一个非常糟糕的设计,但是表是给定的,我无法更改它。请注意,LinksTo字段创建了一种多对多关系

使用代码优先EF,我有以下模型类:

公共类项目 { 公共int ID{get;set;} public int ParentID{get;set;} 公共字符串链接到{get;set;} 公共虚拟项父项{get;set;} [反向属性属性属性] 公共虚拟ICollection子项{get;set;} }
现在,如何向模型添加动态属性,以便在代码中从相反方向访问Item collections Item.Links to和Item.Links?

我想我应该这样做:

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方法,该方法与我认为的一样好


顺便说一句,我甚至还没有检查这个表是否编译。

当它是第一个代码时,为什么会给出这个表?规范化数据,然后创建一个视图,供任何可怜的代码以这种LinksTo格式查看,这将非常容易。据我所知,代码优先是现有数据库的首选方法。不管怎么说,我对代码比对图形设计师更感兴趣。另见。你能告诉我更多关于数据标准化的信息吗?我不知道这意味着什么。老实说,我不知道代码优先可以用于现有数据库。那个视频可能是先有点低估了数据库。模型图和类可以从数据库中自动创建和更新。除非您的数据库没有正确指定外键等,否则通常不需要处理它。即使你不懂行话,你也会直觉地知道规范化是什么。在本例中,违反了字段原子性,即1NF。阅读关于1NF、2NF、3NF的维基文章。但是,如果应用程序正在使用DB,那么更改DB是不可能的。谢谢,这看起来对我有很大帮助!我打算星期一试一试。我没有看到任何代码可以为我提供集合中的Item.links,是否也很难添加它?我花了一些时间才弄清楚,但现在由于您的代码,我已经可以使用它了!this关键字是一个重要的部分,我还没有意识到我可以在模型中实例化数据上下文数据库。我还没有完成LinksFrom集合,但我看到它涉及到使用子字符串匹配对数据库进行查询以查找当前id。