我需要
将一些实体加载到内存中,
改变几个“标量”
属性值 - 无需触及其导航属性。和
将它们作为新实体保存到数据库中。
如何在 EntityFramework 中实现这一点,是否足以将对象的 ID 设置为 NULL 以将其保存为新实体,或者应该是什么技巧?
我需要
将一些实体加载到内存中,
改变几个“标量”
属性值 - 无需触及其导航属性。和
将它们作为新实体保存到数据库中。
如何在 EntityFramework 中实现这一点,是否足以将对象的 ID 设置为 NULL 以将其保存为新实体,或者应该是什么技巧?
You simply need to change the entity state from Modified to Added and Entity Framework will perform an insert instead of an update.
Example using 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
以便您可以找到克隆的来源(如果需要,您可以继续使用外键)。
来源/建议阅读 -将对象复制到对象(使用 Automapper ?)
如果需要,您还可以映射到新的实体类型 - 请参阅 Automapper wiki - https://github.com/AutoMapper/AutoMapper/wiki/Getting-started
在实体必须是唯一的并且对实体的更改会产生一个新实体的项目中,我遇到了同样的困难。我在实体类中创建了一个克隆方法,该方法采用实体,并返回相同的类型。它创建一个新实例,复制所有相关属性,然后返回新实体。
为了更进一步,您可能会创建一个带有 Clone 方法的基类,该方法使用反射来复制属性值并让您的实体从它继承。
根据您使用实体框架的方式,我相信您可以分离和附加您的实体,更改标量值(包括 ID)并将其标记为“已添加”。您可能仍然需要连接/添加外国实体。有关我正在谈论的内容的更多信息,请参阅此页面: