Vin*_*nay 2 c# asp.net-mvc entity-framework c#-4.0 entity-framework-4.1
我们的团队目前正在开发一个Web应用程序,因为我们添加了一个包含Entity Framework .edmx的类库,并生成了POCO类.
我们的Web应用程序基于MVC,我们在具有相同名称和属性的模型中定义了我们的类(从.edmx复制粘贴POCO类)..edmx类库被引用到MVC Web应用程序.
视图是MVC模型类的强类型.我们使用了MVC模型用于Display,StringLength和Required.
在我们的控制器中,当存在CRUD操作时,我们接受POCO类类型,例如
public ActionResult Create(EFModels.User user) { }
Run Code Online (Sandbox Code Playgroud)
EFModels.User是来自.edmx(POCO生成的类)的类,MVC视图是强类型的模型,即MvcWebApplication.Models.User.
问题是我们如何从ActionResult Create中的MvcWebApplication.Models.User(从Model)获取数据到EFModels.User(EF类)?
我能够获取数据,我知道它是同一属性名称的coz.我尝试更改类名但仍然有效,但是如果我们更改属性名称则不起作用.我无法理解它背后的逻辑.
最初我们从来不知道它没有用,我们使用AutoMapper将Model Class转换为Edmx POCO类.
任何想法,谢谢.
问题是我们如何使用任何映射将Model Class的值获取到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; }
}
}
Run Code Online (Sandbox Code Playgroud)
// MVC模型类
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
// 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>
Run Code Online (Sandbox Code Playgroud)
//控制器方法
public ActionResult Create(EFModels.User user)
{
Model1Container con = new Model1Container();
con.Users.Add(user);
con.SaveChanges();
return View("User");
}
Run Code Online (Sandbox Code Playgroud)
当我点击"创建"按钮时,我发布了MvcWebSamp.Models.User类型的数据,并且在"创建操作"中,我可以在不使用任何AutoMapper的情况下获取EFModels.User类型的数据.我想知道这是如何工作的???
您应该使用视图模型作为create方法的参数类型:
[HttpPost]
public ActionResult Create(UserViewModel model)
{
if (ModelState.IsValid)
{
int id = UserService.CreateFromViewModel(model);
return RedirectToAction("View", new { id });
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
您应该将控制器设计为创建和接受视图模型,并将其传递给与您的数据层交互的适当服务,以创建您的域模型.这可以使您的控制器动作非常薄.
您可以在服务中使用类似AutoMapper的内容,轻松地在您的视图模型和域模型之间进行映射:
var user = Mapper.Map<UserViewModel, User>(model);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4083 次 |
| 最近记录: |