我需要
将它们作为新实体保存到Db中。
如何在EntityFramework中实现这一点,是否足以将对象的ID设置为NULL以将其保存为新实体或应该是什么?
答案 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方法创建一个基类,该方法使用反射来复制属性值并让您的实体从中继承。