Есть ли более простой способ присвоить отношения новым объектам в Entity Framework? - PullRequest
3 голосов
/ 26 февраля 2010

В моем примере я пытаюсь создать новый объект, который имеет ссылки на существующие объекты. Мне приходится извлекать полные объекты из базы данных, чтобы ссылаться на них из моего нового объекта.

Извиняюсь за любые небольшие ошибки в коде - я работаю из памяти - у меня нет своего кода со мной.

Моя ViewModel содержит сам объект, два моих ссылочных идентификатора и 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, контекст думает, что я добавляю новую запись, и жалуется, что не установлены все ссылки, необходимые для объекта Team.

Я предполагаю, что есть лучший / более эффективный способ сделать это, но я довольно плохо знаком с EF. Может ли кто-нибудь просветить меня?

Ответы [ 2 ]

3 голосов
/ 26 февраля 2010

Это не требует обращения к базе данных:

gameToSave.MyGame.HomeTeamReference.EntityKey = new EntityKey(context.DefaultContainerName+".Team", "Id", gameToSave.HomeTeamId)
0 голосов
/ 01 марта 2010

Вы также можете сделать это, что лучше 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();
}
...