2

他のエンティティと「1対多」の関連付けを持つエンティティ「プレーヤー」があります。Player 行の 1 つを複製すると、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

上記の detach メソッドはプレーヤーのみをデタッチするため、関連付けられているすべてのエンティティもデタッチする必要があります。

また、重複したキーの挿入を実行しないように、これらの各エンティティの 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 に答える