【发布时间】:2014-09-09 18:51:12
【问题描述】:
示例结构
public class Page
{
public int PageId { get; set; }
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public virtual List<Section> Sections { get; set; }
}
public class Section
{
public int SectionId { get; set; }
public int PageId { get; set; }
public virtual Page Page { get; set; }
public virtual List<Heading> Headings { get; set; }
}
public class Heading
{
public int HeadingId { get; set; }
public int SectionId { get; set; }
public virtual Section Section { get; set; }
}
值得注意的是,我的实际结构比这更多,但这应该足以解释我想要实现的目标。
所以我加载我的Page 对象,然后克隆该对象并对Page 的属性进行一些小的更改,即Prop1、Prop2
Page pageFromDb = getPageMethod();
Page clonedPage = pageFromDb.Clone();
clonedPage.Prop1 = clonedPage.Prop1 + " Cloned";
addPageMethod(clonedPage); //Adds the page to db
在上面的例子中,clonedPage 结构很好,新的Page 被添加到数据库中。但是我相信,因为子对象的 ID 已设置,并且子对象的关系始终是一对多的。原始对象pageFromDb 将失去它作为实体框架的所有子对象,而不是为克隆的Page 创建新的Section 对象会将Section.PageId 更新为新插入的页面。
我相信解决此问题的方法是 foreach、foreach 等,并在插入之前将所有 Id 设置为 0,然后实体框架将为每个对象创建新记录。有没有更简单/更好的方法可以在实体框架环境中克隆对象?
【问题讨论】:
-
克隆方法有什么作用?是在做深拷贝吗?你能告诉它不要复制 ID 字段吗?只要您的集合是正确的,EF 就会在插入后为您建立 Id。
-
@Tim 只是在
Page对象级别的顶部使用 AutoMapper。
标签: c# entity-framework