【问题标题】:How do I create new entities based on old entities in Entity Framework?如何在 Entity Framework 中基于旧实体创建新实体?
【发布时间】:2012-12-20 21:47:28
【问题描述】:

我需要

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

  2. 改变几个“标量”

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

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

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

【问题讨论】:

  • 这是数据库生成的主键吗?

标签: c# .net entity-framework duplicates


【解决方案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();

【讨论】:

  • 当状态改变时,实体实例的EntityKey会发生什么变化?保持原样并在 SaveChanges() 上被忽略并表现得像尚未设置一样?
【解决方案2】:

您可以使用 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

【讨论】:

【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多