2

我有一个与其他实体具有“一对多”关联的实体“玩家”。当我克隆我的 Player 行之一时,与 Player 关联的实体不会被克隆。但 Player 数据行被克隆。我也需要关联值来克隆。我怎样才能做到这一点?

这是我的存储库中的代码

public Player CreateTemplate(Player player)
{
db.Detach(player);
Player.EntityKey = null;
db.AddToPlayer(player);
db.SaveChanges();
return player;
}

这是我的动作方法:

public ActionResult CreatePlayerTemplate(int id)
{
var player = MyRepository.GetPlayerdByID(id);
MyRepository.CreateTemplate(player);
return View();
}

更新:这是我检索的方式Player

 public Player GetPlayerByID(int id)
    {
        return db.Player.SingleOrDefault(x => x.Id == id);
    }
4

2 回答 2

2

您还需要分离所有关联的实体,因为上面的分离方法只分离播放器。

您还需要确保将这些实体中的每一个的 PK 清空,以确保您不会执行重复的密钥插入

public Player CreateTemplate(Player player)
{
   db.Detach(player);
   foreach(var thing in player.Things)
   {
      context.Detach(thing);
      thing.EntityKey = null;
   }
   Player.EntityKey = null;
   db.AddToPlayer(player);
   db.SaveChanges();
   return player;
}
于 2012-05-09T11:56:42.540 回答
2

替代的,有点老套的方法 - 使用映射工具,如AutoMapper

为参与克隆的每个实体定义自映射,并配置为忽略实体键

Mapper.CreateMap<Player, Player>()
.ForMember(x => x.EntityKey, y => y.Ignore());

Mapper.CreateMap<SomeOtherEntity, SomeOtherEntity>()
.ForMember(x => x.EntityKey, y => y.Ignore());

然后只是克隆实体

var clonnedPlayer = Mapper.Map<Player>(originalPlayer);

此外,通过这种方式,您可以配置不克隆类似查找的表以不复制查找数据

于 2012-05-09T12:49:28.277 回答