InsertAllOnSubmit(LINQ to SQL)在相关表中生成重复条目

时间:2014-01-20 13:51:38

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

我有两个名为Activity和ActivityType的表。它们之间存在一对多关系,ActivityType为父类,Activity为子类。

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

如何避免这种情况?

这就是我如何创建与预先存在的ActivityType实体相关的新Activity实体:

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;
}

这是我保存活动实体的方式:

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

    return View();
}

1 个答案:

答案 0 :(得分:1)

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

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