实体框架和MVC模型
我们的团队目前正在开发一个Web应用程序,因为我们有一个添加了Entity Framework .edmx的类库,并生成了POCO类。
我们的Web应用程序基于MVC,我们已经在具有相同名称和属性的模型中定义了我们的类(从.edmx复制POCO类的粘贴)。 .edmx类库引用了MVC Web应用程序。
视图是强类型的MVC模型类 。 我们使用MVC模型进行显示,StringLength&Required。
在我们的控制器中,当有一个CRUD操作时,我们正在接受POCO类类型,例如
public ActionResult Create(EFModels.User user) { }
EFModels.User是.edmx(POCO生成的类)中的一个类,MVC View强制类型为MvcWebApplication.Models.User。
问题是我们如何从MvcWebApplication.Models.User(从Model)将数据从ActionResult创建到EFModels.User(EF类)?
我能够获得这些数据,我知道它是同一个属性名称。 我试着改变类的名字,但仍然有效,但如果我们改变属性名称,它不起作用。 我无法理解它背后的逻辑。
最初我们从来不知道它没有工作,我们使用AutoMapper将Model Class转换为Edmx POCO类。
任何想法,谢谢。
问题是我们如何通过任何映射将模型类的值赋给EF类。 我不需要使用AutoMapper,而不使用我正在获取的值。
看看代码,希望能更好地解释...
// 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>
//控制器方法
public ActionResult Create(EFModels.User user)
{
Model1Container con = new Model1Container();
con.Users.Add(user);
con.SaveChanges();
return View("User");
}
当我点击创建按钮时,我发布了MvcWebSamp.Models.User类型的数据,并且在创建操作中,我可以在不使用任何AutoMapper的情况下获取类型EFModels.User用户的数据。 我想知道这是如何工作的?
您根本没有使用MvcWebSamp
- 如您所见,控制器采用EFModel
public ActionResult Create(EFModels.User user)
它的工作原理是因为属性是相同的。 您只需修改控制器方法签名以取代MvcWebSamp
对象,然后将这些对象转换为EFModel
对象。
您应该将您的视图模型用作create方法的参数类型:
[HttpPost]
public ActionResult Create(UserViewModel model)
{
if (ModelState.IsValid)
{
int id = UserService.CreateFromViewModel(model);
return RedirectToAction("View", new { id });
}
return View(model);
}
您的控制器应该设计为创建并接受视图模型,并将其传递给与您的数据层交互的适当服务以创建您的域模型。 这可以让你的控制器动作非常简单。
你可以在你的服务中使用类似AutoMapper的东西,以便在视图模型和域模型之间轻松映射:
var user = Mapper.Map<UserViewModel, User>(model);
通过将DbContext提供给UI层,您正在创建UI和数据库之间的依赖关系。 尝试分离它并使用存储库模式和依赖注入。
参考: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/29151.html