如何基于Entity Framework中的旧实体创建新实体?

时间:2013-01-07 06:59:26

标签: c# .net entity-framework duplicates

我需要

  1. 将一些实体加载到内存中,
  2. 更改了几个'标量'
  3. 属性值 - 不触及其导航属性。和
  4. 将它们作为新实体保存到Db中。

    如何在EntityFramework中实现这一点,是否足以将对象的ID设置为NULL以将其保存为新实体或应该是什么?

3 个答案:

答案 0 :(得分:1)

您只需将entity state从修改更改为已添加,实体框架将执行插入而不是更新。

使用DbContext API的示例:

DbContext context = // ...
foreach (var entityEntry in context.ChangeTracker.Entries())
{
    if (entityEntry.State == EntityState.Modified)
         entityEntry.State = EntityState.Added;
}
ct.SaveChanges();

答案 1 :(得分:1)

您可以使用Automapper克隆该对象,修改一些属性并将其另存为新实体。

例如:

//Get the source object from a fictitious repository
Person source = PersonRepository.GetPersonByID(555);

//Create an AutoMapper Mapper
Mapper.CreateMap<Person, Person>();
//If you want to ignore the primary key of the original object, use something like this:
//Mapper.CreateMap<Person, Person>().ForMember(x => x.PersonID, y => y.Ignore());

//Clone your source person
var clone = Mapper.Map<Person>(source);

//Set some property
clone.SomeProperty = 123;

//Save our clone against the fictional repository
PersonRepository.Save(clone);

//You could also return your clone at this point...

我前几天使用这种方法来克隆记录。您可以做的一个方便的事情就是确定来源,例如: source.PersonID,并将其存储在clone.ParentID,以便找到克隆的来源(如果需要,可以继续使用外键)。

来源/建议阅读 - Copy object to object (with Automapper ?)

如果需要,您还可以映射到新的实体类型 - 请参阅Automapper wiki - https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

答案 2 :(得分:0)

我在项目中遇到同样的困难,其中实体必须是唯一的,并且对实体的更改会产生新的实体。我在实体类中创建了一个Clone方法,该方法接受实体,并返回相同的类型。它创建一个新实例,复制所有相关属性,然后返回新实体。

为了更进一步,您可以使用Clone方法创建一个基类,该方法使用反射来复制属性值并让您的实体从中继承。