2011-08-18 184 views
2

我們的團隊目前正在開發一個Web應用程序,因爲我們有一個添加了實體框架.edmx的類庫,並生成了POCO類。實體框架和MVC模型

我們的Web應用程序基於MVC,我們已經在具有相同名稱和屬性的模型中定義了我們的類(從.edmx複製POCO類的粘貼)。 .edmx類庫引用了MVC Web應用程序。

該視圖是強類型的MVC模型類。我們使用MVC模型進行顯示,StringLength &必需。

在當存在CRUD操作我們接受POCO類類型如

 public ActionResult Create(EFModels.User user) { } 

EFModels.User我們的控制器與所述的.edmx一個類(POCO生成的類)和MVC視圖強烈鍵入到MvcWebApplication.Models.User模型。

問題是,我們如何從ActionResult中的MvcWebApplication.Models.User(從Model)到EFModels.User(EF類)創建數據?

我能夠獲得數據,我知道它是相同的屬性名稱。我試着改變類的名字,但仍然有效,但如果我們改變屬性名稱,它不起作用。我無法理解它背後的邏輯。

最初我們從來不知道它沒有工作,我們使用AutoMapper將Model Class轉換爲Edmx POCO類。

任何想法,謝謝。

問題是我們如何通過任何映射將模型類的值賦給EF類。我不需要使用AutoMapper,而不使用我正在獲取的值。

看一看代碼,希望能更好地解釋......

// POCO類

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模型類

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視圖頁面

<%@ 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> 

// Contr奧勒方法

public ActionResult Create(EFModels.User user) 
    { 
     Model1Container con = new Model1Container(); 
     con.Users.Add(user); 
     con.SaveChanges(); 
     return View("User"); 
    } 

當我打的創建操作,我能夠得到的類型EFModels.User用戶的數據,而無需使用任何類型MvcWebSamp.Models.User和創建按鈕,我張貼的數據AutoMapper。我想知道這是如何工作的?

+0

你不應該在你的用戶界面中使用你的EF模型。 – Phill

回答

1

你不使用你的MvcWebSamp在所有 - 你可以看到,控制器採取EFModel

public ActionResult Create(EFModels.User user) 

它的工作原理,因爲性質是相同的。您只需修改控制器方法簽名即可取代MvcWebSamp對象,然後將這些對象轉換爲EFModel對象。

+0

由於我直接獲取EFModels.User用戶對象,因此我不必使用AutoMapper。要轉換我必須使用AutoMapper,會影響性能???。我使用MvcWebSamp模型的唯一原因是創建註釋,必填字段和標籤。我在edmx類中創建了註釋,req字段和標籤,但是在編譯edmx時,它會重新生成它的類,並且聲明的註釋和其他項目將會丟失。有沒有解決方法? – Vinay

+0

是的 - 解決方法是編寫EFModel/edmx類的部分類。您可以添加MetadataAttribute以將屬性應用於生成的類中的屬性,如[如何添加元數據類](http://msdn.microsoft.com/zh-cn/library/ee707339(v = vs.91).aspx )或[將屬性添加到生成的類](http://stevesmithblog.com/blog/adding-attributes-to-generated-classes/)。 –

+0

首選的,可維護的和可擴展的模式是使用獨立的類,如你正在做的 - 從EF的數據類,然後用於前端的ViewModel類。但是如果你剛剛開始使用一種相當基本的模式,那麼在使用edmx類的過程中並沒有發現任何問題 - 如果需要,稍後將它們交換出來非常簡單。 –

7

您應該使用您的視圖模型的參數類型爲您打造方法:

[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);