【问题标题】:Updating a junction table with data that is present in the other tables使用其他表中存在的数据更新联结表
【发布时间】:2015-04-28 17:06:45
【问题描述】:

我有这两张桌子

public partial class Items
{
    public Items()
    {
        this.Variables = new HashSet<Variable>();
    }

    public int Id { get; set; }
    public string name {get; set};
    //other columns 

    public virtual ICollection<Variable> Variables { get; set; }
  }
}

public partial class Variable
{
    public Variable()
    {
        this.Items= new HashSet<Items>();
    }

    public int Id { get; set; }
    public string name {get; set};
    //other stuff

    public virtual ICollection<Items> Items{ get; set; }
 }
}

tr 这些都是从数据库第一个实体框架自动创建的(从 edmx 文件中的数据库更新模型)。我需要能够更新从

创建的联结表
public virtual ICollection<Template> Templates { get; set; }
public virtual ICollection<Variable> Variables { get; set; }

联结表只有两列TemplateId和VariableID,它们都是各自表的FK。它们需要在Item和Variable的名称上匹配。目前我能够完成一些(我没有从项目表中获得 ID):

foreach (var tempItem in db.Items)
           {

               var item = db.Variables.FirstOrDefault(x => x.Name tempItem.Name);
                db.Variables.Add(item);

            }
            db.SaveChanges();

编辑:我想要完成的 sql 是:

select Top 1000 V.ID, I.ID
FROM [PageflexWeb].[dbo].[Variables] as V, [PageflexWeb].[dbo].[Items] as I
Where V.Name = I.Name

这很好用,但我需要一种方法将其保存到联结表 dbo.ItemVariables

任何帮助将不胜感激。

我已经阅读了有关 msdn 和 stack 的所有文档,但我无法找到我正在寻找的答案。

【问题讨论】:

  • context.SaveChanges();
  • db.Variables.Add(item);给出一个错误,指出 Iqueryable 不可分配给参数类型 Model.Item。然后我更改为变量 item = context.Variables.Where(x => x.Name == templateItem.Name);给出了一个错误,无法转换源类型。这将在 context.savechanges 之前
  • db 是 DbContext 还是 Items?如果它是Items,那么您只需将其添加到变量集合中,然后在您的 DbContext 上调用 SaveChanges(假设您启用了更改跟踪),并且当前附加了 db(从数据库加载)。
  • 抱歉,您的代码有错误。将var item = context.Variables.Where(x =&gt; x.Name == templateItem.Name); 更改为var item = context.Variables.First(x =&gt; x.Name == templateItem.Name)
  • db 设置为 modelEntities,其中 model 是我的模型的名称,该模型是实体框架在使用 ADO.NET 实体数据模型时创建的?上下文也设置相同

标签: c# asp.net-mvc linq junction-table


【解决方案1】:
Db.Templates.Add(newItem);
foreach (var record in variable.Where(record => record.Name == newItem.Name))
    {
         record.Templates.Add(newItem);
    }

}
Db.SaveChanges();

所以我需要将 newItem 添加到项目表中 - 然后加载记录并通过它们建立关系。除非有另一种自动更新方式(changeTracking?),否则我会将其标记为答案。谢谢@罗伯特麦基

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 1970-01-01
    • 2013-01-11
    • 2021-06-26
    • 1970-01-01
    • 2018-09-29
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多