【问题标题】:InsertAllOnSubmit (LINQ to SQL) generates duplicate entries in related tablesInsertAllOnSubmit (LINQ to SQL) 在相关表中生成重复条目
【发布时间】:2014-01-20 13:51:37
【问题描述】:

我有两个名为 Activity 和 ActivityType 的表。两者之间是一对多的关系,ActivityType 为父类,Activity 为子类。

当我尝试将新创建的实体存储在与现有 ActivityType 实体相关的 Activity 表中时,我最终会得到那些预先存在的 ActivityType 实体的重复条目。

如何避免这种情况?

这就是我创建新的 Activity 实体的方式,它增加了与预先存在的 ActivityType 实体的关系:

var activities = (Session["Activities"] as List<D.Activity>);
if(activities == null)
    activities = new List<D.Activity>();

using (var dbContext = new D.DataClassesDataContext())
{
    var activityType = (from x in dbContext.ActivityTypes
                        where x.ClientID == this.Client.ClientID && x.ActivityTypeID == model.ActivityTypeID
                        select x).SingleOrDefault();

    var activity = new D.Activity()
    {
        ActivityType = activityType,
        ActivityTypeID = activityType.ActivityTypeID,
        ClientID = this.Client.ClientID,
        Description = model.ActivityDescription,
        PerformedByEmployeeID = this.User.UserId,
        PerformedDate = model.WorkDay,
        ProjectID = model.EntityID,
        StartTime = model.ActivityStartTime,
        StopTime = model.ActivityStopTime
    };

    activities.Add(activity);
    Session["Activities"] = activities;
}

这是我保存 Activity 实体的方式:

using (var dbContext = new D.DataClassesDataContext())
{
    var activities = (Session["Activities"] as List<D.Activity>);
    dbContext.Activities.InsertAllOnSubmit(activities);
    dbContext.SubmitChanges();

    return View();
}

【问题讨论】:

    标签: c# sql linq linq-to-sql


    【解决方案1】:

    我在这里猜测一下:当您加载实体时,EntityFramework 会为您跟踪更改。 您更改实体,然后将它们写入会话,这会创建一个新对象,而不是对您加载的实体的引用。 然后再次加载该对象并将其转换为列表。现在您插入会话列表,EF 仍然跟踪加载实体上的更改并保存这些更改以及重复的列表。

    简而言之:摆脱会话内容,因为它不是对您的列表的引用,而是它的副本。如果您正确设计您的应用程序,这也是不必要的。

    【讨论】:

    • 正确阅读您的问题后更正:当您将列表写入会话时,已加载的 ActivityTypes 被复制,因此被复制。 EF 将它们视为新实体,然后插入新记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多