ViewModel w aplikacji MVC

0

Mam pewien dość dziwny problem (dziwny ponieważ nie widzę tak naprawdę przyczyny takiego zachowania aplikacji).
Tworzę system do rejestracji użytkowników i zrobiłem sobie Model oraz ViewModel (do walidacji danych i ogólnie stosowania atrybutów). W kontrolerze robię mniej więcej coś takiego:

[HttpPost]
        public ActionResult Create(UserViewModel u)
        {
            user.ID = u.ID;
            user.userEmail = u.userEmail;
            user.userName = u.userName;
            user.userPassword = u.userPassword;

            dbContext.users.Add(user);
            dbContext.SaveChanges();

            return View();
        } 

Czyli przepisuję to co chcę zapisać do bazy do prawidłowego modelu.
Nie wiem natomiast dlaczego w mojej klasie kontekstu bazy (CodeFirst) automatycznie dodaje się coś takiego:

 public System.Data.Entity.DbSet<ProjectManagement.ViewModels.UserViewModel> UserViewModels { get; set; } 

Przez co tworzy się w bazie dodatkowa tabela zawierająca dane z ViewModelu. Łamie to troszkę koncepcję bo własnie chodzi o to, żeby niektórych danych tam nie było (jak np. ponowne wpisanie hasła).
Jak to pominąć?

0

Poczytaj o EntityFramework i CodeFirst.

Model który definiujesz powinien zawierać tylko te property które potem mają się znaleźć w bazie.

Czyli tworząc taki formularz rejestracji powinieneś utworzyć dodatkową klasę "Register" Która będzie miała Pola Login/Password/ConfPassword

A następnie po walidacji przepisać dane z klasy Register do klasy na podstawie której będzie utworzona tabela użytkowników.

0

Z czego dziedziczy UserViewModel? W ogóle pokaż kod swoich klas, bo o ile M$ spieprzył w EF wiele rzeczy, to w automagiczne generowanie między encjami i viewmodelami trudno mi uwierzyć.

Drugie pytanie - dlaczego w ogóle ręcznie ustawiasz ID encji: user.ID = u.ID;?! Coś tu jest bardzo nie tak.

0

@somekind

Oto user:

 public class User
    {
        public int ID { get;set; }
        public string userName { get;set; }
        public string userPassword { get;set; }
        public string userEmail { get;set; }
    }

A to ViewModel dla usera:

   public class UserViewModel
    {
        public int ID { get; set; }

        [DisplayName("User Name")]
        public string userName { get; set; }
        public string userPassword { get; set; }
        public string userEmail { get; set; }
    }
 

Tam oczywiście jest więcej atrybutów ale to dla przykładu.
Teraz Context:

  public class ProjectContext : DbContext
    {
        public DbSet<User> users { get; set; }

        public ProjectContext() : base("ProjectManagement")
        {
            Database.SetInitializer<ProjectContext>(new DropCreateDatabaseIfModelChanges<ProjectContext>());
        }

       // public System.Data.Entity.DbSet<ProjectManagement.ViewModels.UserViewModel> UserViewModels { get; set; }

        // public System.Data.Entity.DbSet<ProjectManagement.ViewModels.UserViewModel> UserViewModels { get; set; }
    }
 

Zakomentowałem to, co się wygenerowało bo tego nie chcę.
Kontroler:

public class RegisterController : Controller
    {
        private ProjectContext dbContext = new ProjectContext();
        private User user = new User();
        // GET: Register
        public ActionResult Index()
        {
            return View();
        }
        public ActionResult Create()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(UserViewModel u)
        {
            //user.ID = u.ID;
            user.userEmail = u.userEmail;
            user.userName = u.userName;
            user.userPassword = u.userPassword;

            dbContext.users.Add(user);
            dbContext.SaveChanges();

            return View();
        }
    }
 

z tym ID to mój błąd :P sorki.
Oczekuję, że przez to do bazy zapisze się sam Model a nie ViewModel.. a on mi to generuje na siłę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1