2016-02-07 2 views
0

Я пытаюсь разработать свой первый проект ASP.net MVC с Entity Framework. Я не использовал никаких моделей просмотров, я использовал одни и те же модели для просмотра и транзакций базы данных. Вот что, у меня есть пользовательская таблица. В создании у меня есть 5 вещей в моей модели User: UserName, UserPassword, FullName, Branch и BranchId (Навигация к другой таблице). Но когда я хочу редактировать пользователя, мне не нужно поле UserPassword, потому что смена пароля будет невозможна. Поэтому я создал модель с моделью User, за исключением поля UserPassword с именем UserEdit.Копирование модели представления в модель данных

В режиме просмотра я использую модель User, в режиме редактирования я использую модель UserEdit. В контроллере я использую autoapper и копирует значения от User до UserEdit и возвращает это для просмотра. Он работает нормально, проблема в обновлении.

Я пытаюсь обновить пользователя, как это:

public bool Update(UserEdit userEdit) { 
     User user = Find(userEdit.UserUsername); 

     Mapper.CreateMap<UserEdit, User>(); 

     user = (User)Mapper.Map(userEdit, user, typeof(UserEdit), typeof(User)); 

     if (_modelState.IsValid) 
     { 
      _transactionManager.GetContext().Entry(user).State = System.Data.Entity.EntityState.Modified; 
      _transactionManager.CommitTransaction(); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

Но это дает мне эту ошибку:

Additional information: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

Когда я проверить пользователь я пытаюсь обновить, я вижу Объекты Entity Framework, связанные с ним. Поэтому я думаю, что причиной этой ошибки является, вероятно, таблица ветвей и связанные объекты в объекте пользователя. Мне действительно не нужны эти объекты, связанные с объектами, в моем пользовательском объекте. Если бы я мог только копировать свойства в модели, было бы здорово. Может быть, я делаю что-то еще неправильно. Поскольку я знаю, что люди все время используют модели просмотра, должен быть простой способ сделать это.

Любые идеи?

Thanks

+0

Невозможно помочь, не видя ваши модели (данные и просмотреть модель), но убедитесь, что все свойства обновляются. –

+0

Я действительно сказал, как мои модели, есть только 5 полей на моей основной модели, модель просмотра такая же, только отсутствие пароля. – user3781428

+0

Показать их, и представление (и было бы бессмысленно иметь 'Branch' и' BranchID' в модели представления) –

ответ

0

Вы действительно не должны откатывать свою собственную аутентификацию по паролю. Используйте то, что встроено в MVC. Тем не менее, самый простой способ сохранить вашу модель обзора будет таким;

using (YourContext db = new YourContext()) 
{ 
    User u = db.User.Find(userEdit.UserUsername); 
    db.Entity(u).State = System.Data.Entity.EntityState.Modified; 
    u.FullName = userEdit.FullName; 
    ....set the other properties here... 

    db.SaveChanges(); 
} 
+0

Я могу это сделать, но я подумал, что было бы лучше сделать это с помощью automapper. – user3781428

+0

Automapper вводит дополнительный уровень сложности. Он имеет свое место, но для отображения 5 полей я бы не использовал его. Для вашего первого проекта, держите его простым, воспользовавшись automapper, когда у вас есть лучшее понимание моделей. –

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