EF复制具有导航属性的实体

时间:2017-05-22 09:58:00

标签: c# entity-framework

我需要复制对象及其导航属性并创建新对象。以下是我的所作所为:

            // 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对象创建。我没有得到任何错误,但只是他们没有为别人创造。

0 个答案:

没有答案
相关问题