如何在实体框架中基于旧实体创建新实体

本文关键字:实体 新实体 创建 于旧 框架 | 更新日期: 2023-09-27 17:51:00

我需要

  1. 加载一些实体到内存中,

  2. 更改其'标量'

  3. 属性值-不触及其导航属性。和

  4. SAVE them as a NEW Entity into the Db.

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

如何在实体框架中基于旧实体创建新实体

您只需将实体状态从Modified更改为Added,实体框架将执行插入而不是更新。

使用DbContext API的例子:

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

您可以使用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中,这样您就可以找到克隆的起源(如果您愿意,可以继续使用外键this)。

来源/建议阅读-复制对象到对象(与Automapper ?)

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

根据你如何使用实体框架,我相信你可以分离和附加你的实体,改变标量值(包括ID),并将其标记为"添加"。您可能仍然需要连接/添加外部实体。关于我所说的更多信息,请参阅本页:

http://msdn.microsoft.com/en-us/data/jj592676.aspx

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

更进一步,您可能会创建一个带有Clone方法的基类,该方法使用反射来复制属性值,并让您的实体从它继承。