2

我需要

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

  2. 改变几个“标量”

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

  4. 将它们作为新实体保存到数据库中。

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

4

4 回答 4

1

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();
于 2013-01-07T15:25:38.043 回答
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以便您可以找到克隆的来源(如果需要,您可以继续使用外键)。

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

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

于 2013-01-08T01:12:29.810 回答
0

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

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

于 2013-01-07T15:17:03.493 回答
0

根据您使用实体框架的方式,我相信您可以分离和附加您的实体,更改标量值(包括 ID)并将其标记为“已添加”。您可能仍然需要连接/添加外国实体。有关我正在谈论的内容的更多信息,请参阅此页面:

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

于 2013-01-07T07:31:38.240 回答