如何在实体框架中基于旧实体创建新实体
本文关键字:实体 新实体 创建 于旧 框架 | 更新日期: 2023-09-27 17:51:00
我需要
-
加载一些实体到内存中,
-
更改其'标量'
-
属性值-不触及其导航属性。和
-
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方法的基类,该方法使用反射来复制属性值,并让您的实体从它继承。