Как создать новый объект сущности, изменить его в Model до SaveChanges () - PullRequest
2 голосов
/ 03 августа 2011

Я уже несколько часов занимаюсь этой проблемой и не могу ее решить. Поэтому я использую ASP.NET MVC 3 с Entity Framework 4.1. Пишу контроллер управления учетными записями и модели с нуля. Моя проблема заключается в том, что всякий раз, когда Контроллер получает заполненный объект-сущность из Представления и отправляет его далее в Модель, Модель не сохраняет его, если я попытаюсь заранее изменить любое из полей.

Вот соответствующая часть моей модели с именем ModelManager.cs:

public class MemberManager
{
    private DAL db = new DAL();

    public void Add(Member member)
    {
        member.Password = Crypto.HashPassword(member.Password);
        db.Members.Add(member);
        db.SaveChanges();
    }

Эта модель получает объект сущности Member member в качестве параметра от контроллера, соответствующая часть которого ниже:

    [HttpPost]
    public ActionResult Register(Member member)
    {
            try
            {
                if (ModelState.IsValid)
                {
                    MemberManager memberManager = new MemberManager();
                    if (!memberManager.UsernameExist(member.Username))
                    {
                        memberManager.Add(member);
                        FormsAuthentication.SetAuthCookie(member.FirstName, false);
                        return RedirectToAction("Welcome", "Home");
                    }
                    else
                    {
                        ModelState.AddModelError("", "Username already taken.");

                    }
                }
            }
            catch
            {
                ModelState.AddModelError("", "Could not complete account creation. Please try again.");
            }

            return View(member);
    }

Если я удаляю любую модификацию любого свойства объекта сущности в Модели, код работает (т.е. я удаляю строку, где я Crypto.HashPassword поле Пароль объекта сущности. Сначала я подумал проблема была с HashPassword, но если я изменю эту строку, чтобы просто изменить элемент. Пароль на строку «1», он также не будет работать.

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

Кстати, возникла ошибка исключения:

System.Data.Entity.Validation.DbEntityValidationException: проверка не удалась для одного или нескольких объектов. См. Свойство EntityValidationErrors для более подробной информации. в System.Data.Entity.Internal.InternalContext.SaveChanges () в System.Data.Entity.Internal.LazyInternalContext.SaveChanges () в System.Data.Entity.DbContext.SaveChanges () в Politiq.Models.ObjectManager.MemberManager. (Член-участник) в C: \ Users \ C. Yehia \ Documents \ Visual Studio 2010 \ Projects \ Politiq2 \ Models \ ObjectManager \ MemberManager.cs: строка 21 в Politiq.Controllers.AccountController.Register (член-участник) в C: \ Users \ C. Yehia \ Documents \ Visual Studio 2010 \ Проекты \ Politiq2 \ Controllers \ AccountController.cs: строка 39

1 Ответ

0 голосов
/ 03 августа 2011

Я вижу, что ваш экземпляр члена создается связующим элементом модели (т. Е. Не в вашем коде), но я не вижу, чтобы он фактически добавлялся в таблицу.Вы пропустили db.Members.Add() звонок?

В любом случае, я бы предложил создать отдельный класс модели для «регистрационных данных», чтобы вы не позволяли связующему модели MVC создавать экземпляр Member, а создавали его самостоятельно.Причина в том, что этот подход небезопасен, поскольку по умолчанию связыватель будет пытаться назначить каждое поле ввода HTML соответствующему свойству , чтобы хакер мог вставить значение Id в ваш объект, что вызовет исключение (и, вероятно,некоторые другие неприятные вещи).

Конечно, вы можете использовать [Bind(Exclude="ID")], чтобы он не пытался заполнить идентификатор, но я все равно разделил бы сущности базы данных и пользовательский ввод:

MemberController

public ActionResult Register(RegistrationForm form)

MemberManager

public Member RegisterMember(RegistrationForm form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...