Entity Framework & MVC Models
Our team is currently developing a web application, in that we have a class library with Entity Framework .edmx added and have generated the POCO classes.
Our Web Application is based on MVC, we have defined our classes in models with the same name and attributes (copy paste of the POCO classes from the .edmx). The .edmx class library is refrenced to MVC web application.
The Views are strongly typed of MVC Model classes . We have used MVC Models for Display, StringLength & Required.
In our controller when there is a CRUD operation we are accepting the POCO Classes Type such as
public ActionResult Create(EFModels.User user) { }
EFModels.User is a class from the .edmx (POCO generated class) and the MVC View is strongly typed to the model which is MvcWebApplication.Models.User.
Question is how are we getting data from the MvcWebApplication.Models.User (from Model) to EFModels.User (EF class) in the ActionResult Create ??
I am able to get the data, I know it is coz of the same property name. I tried changing the class name but still it works, but if we change the property name it does not work. I cannot understand the logic behind it.
Initially we never knew it didn`t work and we were using AutoMapper to convert the Model Class to Edmx POCO class.
Any ideas, Thanks.
The question is how are we getting the values of the Model Class to the EF class with any mapping. I don`t need to use AutoMapper, without using that I am getting the values.
Have a look at the code, hope that explains better...
//POCO CLASS
namespace EFModels
{
using System;
using System.Collections.Generic;
public partial class User
{
public int Id { get; set; }
public string Type { get; set; }
public string Name { get; set; }
}
}
//MVC Model Class
namespace MvcWebSamp.Models
{
public class User
{
public int Id { get; set; }
[Display(ResourceType = typeof(BasicTags), Name = "Type")]
[StringLength(15, ErrorMessageResourceName = "TypeLength", ErrorMessageResourceType = typeof(BasicTags))]
[Required(ErrorMessageResourceName = "TypeRequired", ErrorMessageResourceType = typeof(BasicTags))]
public string TypeName { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
}
//MVC VIEW PAGE
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcWebSamp.Models.User>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
User
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>User</h2>
<% using (Html.BeginForm("Create", "User", FormMethod.Post))
{
%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>User</legend>
<div class="editor-field">
<%: Html.LabelFor(model => model.TypeName) %>
<%: Html.EditorFor(model => model.TypeName)%>
<%: Html.ValidationMessageFor(model => model.TypeName)%>
</div>
<div class="editor-field">
<%: Html.LabelFor(model => model.Name) %>
<%: Html.EditorFor(model => model.Name)%>
<%: Html.EditorFor(model => model.Address.street)%>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
</asp:Content>
//Controller Method
public ActionResult Create(EFModels.User user)
{
Model1Container con = new Model1Container();
con.Users.Add(user);
con.SaveChanges();
return View("User");
}
When I hit the Create Button, I am posting data of the type MvcWebSamp.Models.User and in the Create Action I am able to get the data of the type EFModels.User user without using any AutoMapper. I want to know how this works???
You aren't using your MvcWebSamp
at all - as you can see, the controller takes the EFModel
public ActionResult Create(EFModels.User user)
It works because the properties are the same. You just need to modify the controller method signatures to take the MvcWebSamp
objects instead, and then transform those objects to the EFModel
objects.
You should be using your view model as the argument type for your create method:
[HttpPost]
public ActionResult Create(UserViewModel model)
{
if (ModelState.IsValid)
{
int id = UserService.CreateFromViewModel(model);
return RedirectToAction("View", new { id });
}
return View(model);
}
You controller should be designed to create and accept view models, and it passes those to an appropriate service which interacts with your data layer to create your domain model. This keeps your controller action quite thin.
You can use something like AutoMapper in your service to easily map between your view model and your domain model:
var user = Mapper.Map<UserViewModel, User>(model);
By giving DbContext to UI Layer you are creating dependancy between UI and database. Try to seperate it and use repository pattern and dependency injection.
Reference: http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx
http://prodinner.codeplex.com/releases/view/66899
链接地址: http://www.djcxy.com/p/29152.html
下一篇: 实体框架和MVC模型