在我的示例中,我正在尝试创建一个引用现有对象的新对象。我发现自己必须从数据库中检索完整的对象才能从我的新对象中引用它们。
为代码中的任何小错误道歉 - 我在内存中工作 - 我没有我的代码。
我的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();
}
你在这里看到问题 - 我正在做两个额外的数据库查询来检索模型,所以我可以绑定它们。真的,我应该只需要Id。
如果我只设置HomeTeam.Id和AwayTeam.Id属性,则上下文认为我正在添加一条新记录并抱怨没有设置Team对象所需的所有引用。
我认为有更好/更有效的方法来做到这一点,但我对EF很新。谁能开导我?
答案 0 :(得分:3)
这不需要数据库往返:
gameToSave.MyGame.HomeTeamReference.EntityKey = new EntityKey(context.DefaultContainerName+".Team", "Id", gameToSave.HomeTeamId)
答案 1 :(得分:0)
你也可以这样做,这是更漂亮的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();
}