我需要复制对象及其导航属性并创建新对象。以下是我的所作所为:
// get parent location's work availability template
WorkAvailTemplate workAvailTemplate = locationsFromDb.Where(l => l.Location2 == null).SingleOrDefault().WorkAvailTemplates.First();
foreach (var loc in locationsToAddOrUpdate)
{
// add op-hours template only for the new locations (the ID sometimes can be -1
if (loc.LocationId < 1)
{
if (workAvailTemplate != null)
{
WorkAvailTemplate wt = new WorkAvailTemplate
{
Location = loc,
CreatedBy = this.CurrentUser.Id,
CreatedDate = DateTime.Now,
NumberOfRotations = workAvailTemplate.NumberOfRotations,
ActiveStatus = workAvailTemplate.ActiveStatus
};
ClientContext.WorkAvailTemplates.Add(wt);
var workAvailTemplateDays = workAvailTemplate.WorkAvailTemplateDays.ToList();
foreach (WorkAvailTemplateDay d in workAvailTemplateDays)
{
WorkAvailTemplateDay wd = new WorkAvailTemplateDay
{
WorkAvailTemplate = wt,
WeekNumber = d.WeekNumber,
DayNumber = d.DayNumber,
ChangedBy = this.CurrentUser.Id,
ChangedDate = DateTime.Now
};
ClientContext.WorkAvailTemplateDays.Add(wd);
foreach (var r in d.WorkAvailTemplateTimeRanges)
{
WorkAvailTemplateTimeRange wr = new WorkAvailTemplateTimeRange
{
WorkAvailTemplateDay = wd,
StartTime = r.StartTime,
EndTime = r.EndTime,
ChangedBy = this.CurrentUser.Id,
ChangedDate = DateTime.Now
};
ClientContext.WorkAvailTemplateTimeRanges.Add(wr);
}
}
}
}
}
我确信有更好的方法来做到这一点而不是创建新对象。有什么想法吗?
早些时候,当我为单个Location对象创建时,我按照以下方式执行此操作并且工作正常。
WorkAvailTemplate workAvailTemplate = (from wat in ClientContext.WorkAvailTemplates
where wat.FkLocationId == newLocation.FkParentLocationId
select wat).SingleOrDefault();
if (workAvailTemplate != null)
{
workAvailTemplate.Location = newLocation;
ClientContext.WorkAvailTemplates.Add(workAvailTemplate);
var workAvailTemplateDays = from watd in ClientContext.WorkAvailTemplateDays
join wat in ClientContext.WorkAvailTemplates on watd.FkWorkAvailTemplateId equals wat.WorkAvailTemplateId
where wat.FkLocationId == newLocation.FkParentLocationId
select watd;
foreach (WorkAvailTemplateDay d in workAvailTemplateDays)
{
d.WorkAvailTemplate = workAvailTemplate;
var workAvailTimeRangePerDay = (from r in ClientContext.WorkAvailTemplateTimeRanges.AsEnumerable()
where r.FkWorkAvailTemplateDayId == d.WorkAvailTemplateDayId
select this.f(r, d, newLocation));
ClientContext.WorkAvailTemplateDays.Add(d);
ClientContext.WorkAvailTemplateTimeRanges.AddRange(workAvailTimeRangePerDay);
}
}
但是当我为循环中的多个对象做同样的事情时,它只为第一个Location对象创建。我没有得到任何错误,但只是他们没有为别人创造。