2012-01-19 3 views
0

WPF-MVVM-EntityFrameworkEntityFramework обновить существующий Entity

У меня есть проблема, когда я пытаюсь обновить существующий объект в проекте MVMV WPF У меня есть пользователя объект, на котором есть коллекция из UserApplication

UserApplication идентификатор_сервера INT ApplicationID INT UserId INT BinDirectory VARCHAR (MAX)

Пользователь Войти VARCHAR (50) Id ИНТ

Когда я добавляю новое приложение для моего пользователя, мне нужно, чтобы добавить запись в моей таблице UserApplications.

В моем классе модели User есть метод AddApplication

public void AddApplication (int appId, int serverId, string bin) 
{ 
this.userApplications.add (new UserApplication(){ 
ApplicationId = appId, 
ServerId = serverId, 
BinDirectory = bin, 
userId = this.Id 
}); 
} 

На мой взгляд, модель есть следующий код

this.currentUser.AddApplication(_currentApp.Id, _currentServer.Id, "my_directory"); 
userDao.Update(this.currentUser); 

В userDao

public int Update(User userToSave) 
     {     
      using (Context dpEnt = new Context()) 
      { 
       try 
       { 
        dpEnt.Attach(userToSave); 
        return dpEnt.SaveChanges(); 
       } 
       catch (Exception ex) 
       { 
        _log.Error(ex.Message); 
        return -1; 
       } 
      } 
     } 

Здесь я имеют следующее исключение при вызове Attach: Obje ct с временным значением EntityKey не может быть привязан к контексту объекта.

Я также попробовать (userDao)

public int Update(UserApplication userApp) 
      {     
       using (Context dpEnt = new Context()) 
       { 
        try 
        { 
         dpEnt.UserApplications.AddObject(userApp); 
         return dpEnt.SaveChanges(); 
        } 
        catch (Exception ex) 
        { 
         _log.Error(ex.Message); 
         return -1; 
        } 
       } 
      } 

Здесь, также не работает

Можете ли вы помочь мне, пожалуйста?

+0

Ваше первое решение не может работать, потому что приложение не вставляет новую запись. Какую ошибку вы получаете со своим вторым решением? – KroaX

ответ

0

Вы должны добавить заявку пользователю после, вы подключили пользователя к контексту. В противном случае EF не распознает новое приложение:

В userDao вам нужен какой-то метод, как:

public int AddApplicationToUser(User userToSave, 
    int appId, int serverId, string bin) 
{     
    using (Context dpEnt = new Context()) 
    { 
     try 
     { 
      dpEnt.Attach(userToSave); 
      userToSave.AddApplication(appId, serverId, bin); 

      return dpEnt.SaveChanges(); 
     } 
     catch (Exception ex) 
     { 
      _log.Error(ex.Message); 
      return -1; 
     } 
    } 
} 

и только тогда звоните:

userDao.AddApplicationToUser(this.currentUser, 
    _currentApp.Id, _currentServer.Id, "my_directory"); 

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

Смежные вопросы