2010-02-26 61 views
3

在我的示例中,我试图创建一个具有对现有对象的引用的新对象。我发现自己不得不从数据库中检索完整的对象,以便从我的新对象中引用它们。是否有一种更简单的方法将关系分配给实体框架中的新对象?

道歉的代码中的任何小错误 - 我从内存工作 - 我没有我的代码与我。

我的视图模型包含对象本身,我的两个参考ID,以及被引用的对象的选择列表,所以我可以绑定到一个下拉:

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很新。任何人都可以启发我吗?

回答

3

这不需要数据库往返:

gameToSave.MyGame.HomeTeamReference.EntityKey = new EntityKey(context.DefaultContainerName+".Team", "Id", gameToSave.HomeTeamId) 
+0

哇,真的吗?男人......我怎么错过那个......? – Damovisa 2010-02-26 02:38:54

+0

@Damovisa:对不起,但我不知道:) – LukLed 2010-02-26 02:44:47

+0

我想我只是假设它做到了。我会确认何时回家,但我相信你是对的。谢谢 :) – Damovisa 2010-02-26 02:45:58

0

你也可以做到这一点,这是海事组织漂亮:

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(); 
} 
相关问题