我有两个名为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();
}
答案 0 :(得分:1)
我在这里猜测:当您加载实体时,EntityFramework会为您跟踪更改。 您更改实体,然后将它们写入会话,这将创建一个新对象,而不是对已加载实体的引用。 然后再次加载该对象并将其转换为List。现在您插入会话列表,EF仍然跟踪已加载实体的更改,并保存这些更改以及重复列表。
简而言之:摆脱会话的东西,因为它不是对你的列表的引用,而是它的副本。如果您正确设计应用程序,也没有必要。