实体框架和MVC模型

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类型的数据.我想知道这是如何工作的???

Mat*_*ott 7

您应该使用视图模型作为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)