代码之家  ›  专栏  ›  技术社区  ›  Damovisa

在实体框架中,是否有一种更简单的方法来为新对象分配关系?

  •  3
  • Damovisa  · 技术社区  · 16 年前

    在我的示例中,我试图创建一个新对象,该对象引用了现有对象。我发现自己必须从数据库中检索完整的对象,以便从新对象引用它们。

    为代码中的任何小错误道歉-我在记忆中工作-我没有我的代码。

    我的ViewModel包含对象本身、我的两个引用ID和被引用对象的SelectList,因此我可以绑定到下拉列表:

    public class GameEditViewModel
    {
        public Game MyGame { get; set; }
        public int HomeTeamId { get; set; }
        public int AwayTeamId { get; set; }
        public SelectList<Team> { get; set; }
    }
    

    我正在设置和获得完美的一切,当我得到它时,对象是完全填充的,但是当我试图保存这个新游戏时,问题出现了:

    public Game AddGame(GameEditViewModel gameToSave)
    {
        gameToSave.MyGame.HomeTeam = 
            context.GetObjectByKey(new EntityKey(context.DefaultContainerName+".Team", "Id", gameToSave.HomeTeamId)) as Team;
        context.Attach(gameToSave.MyGame.HomeTeam);  // I think I needed this line
        gameToSave.MyGame.AwayTeam = 
            context.GetObjectByKey(new EntityKey(context.DefaultContainerName+".Team", "Id", gameToSave.AwayTeamId)) as Team;
        context.Attach(gameToSave.MyGame.AwayTeam);
    
        context.AddToGame(MyGame);
        context.SaveChanges();
    }
    

    您可以在这里看到问题所在——我正在执行两个额外的数据库查询来检索模型,以便绑定到它们。真的,我只需要身份证。

    如果我刚刚设置了hometeam.id和awayteam.id属性,上下文会认为我正在添加一个新记录,并抱怨没有设置团队对象所需的所有引用。

    我想有更好/更有效的方法来做这件事,但我对英孚还很陌生。有人能启发我吗?

    2 回复  |  直到 16 年前
        1
  •  3
  •   LukLed    16 年前

    gameToSave.MyGame.HomeTeamReference.EntityKey = new EntityKey(context.DefaultContainerName+".Team", "Id", gameToSave.HomeTeamId)
    
        2
  •  0
  •   user283687    16 年前

    你也可以这样做,这是更漂亮的IMO:

    public Game AddGame(GameEditViewModel gameToSave)
    {
        gameToSave.MyGame.HomeTeam = new Team { Id = gameToSave.HomeTeamId };
        gameToSave.MyGame.AwayTeam = new Team { Id = gameToSave.AwayTeamId };
    
        context.AddToGame(MyGame);
        context.SaveChanges();
    }