Entity Framework & MVC Models - PullRequest
       27

Entity Framework & MVC Models

2 голосов
/ 18 августа 2011

Наша команда в настоящее время разрабатывает веб-приложение, в котором у нас есть библиотека классов с добавленной Entity Framework .edmx и сгенерированы классы POCO.

Наше веб-приложение основано на MVC, мы определили нашеклассы в моделях с одинаковыми именами и атрибутами (скопируйте вставку классов POCO из .edmx).Библиотека классов .edmx связана с веб-приложением MVC.

Представления строго типизированы из Классы моделей MVC .Мы использовали модели MVC для отображения, StringLength и Required.

В нашем контроллере, когда есть операция CRUD, мы принимаем тип классов POCO, такой как

     public ActionResult Create(EFModels.User user)    {    }

EFModels.User являетсякласс из .edmx (сгенерированный класс POCO) и MVC View строго типизированы для модели MvcWebApplication.Models.User.

Вопрос в том, как мы получаем данные из MvcWebApplication.Models.User (изМодель) в EFModels.User (класс EF) в ActionResult Create ??

Я могу получить данные, я знаю, что это coz с тем же именем свойства.Я попытался изменить имя класса, но все равно оно работает, но если мы изменим имя свойства, оно не будет работать.Я не могу понять логику этого.

Изначально мы никогда не знали, что это не работает, и мы использовали AutoMapper для преобразования класса модели в класс POCO Edmx.

Любые идеи, спасибо.

Вопрос в том, как мы получаем значения класса модели в класс 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

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>

// Метод контроллера

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

Когда янажимая кнопку «Создать», я публикую данные типа MvcWebSamp.Models.User, и в действии «Создать» я могу получить данные пользователя типа EFModels.User без использования AutoMapper.Я хочу знать, как это работает ???

Ответы [ 5 ]

7 голосов
/ 18 августа 2011

Вы должны использовать модель представления в качестве типа аргумента для вашего метода создания:

[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);
2 голосов
/ 18 августа 2011

Предоставляя DbContext UI Layer, вы создаете зависимость между 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
1 голос
/ 12 октября 2011

Чтобы использовать Entity Framework, необходимо создать модель данных Entity. Для добавления Entity Model:

1) Щелкните правой кнопкой мыши на папке модели в обозревателе решений. 2) Выберите Добавить новый элемент.

для более подробной информации, пожалуйста, проверьте следующую ссылку ....

http://www.mindstick.com/Articles/6f3bb3c6-d195-487b-8b82-244bb417b249/?Model%20classes%20with%20Entity%20Framework%20in%20MVC

Спасибо !!!

1 голос
/ 18 августа 2011

Вы вообще не используете свой MvcWebSamp - как видите, контроллер принимает EFModel

public ActionResult Create(EFModels.User user)

Он работает, потому что свойства одинаковы.Вам просто нужно изменить сигнатуры методов контроллера, чтобы вместо них взять объекты MvcWebSamp, а затем преобразовать эти объекты в объекты EFModel.

1 голос
/ 18 августа 2011

Automapper должен работать. Мы используем его постоянно, даже с разными именами свойств. Пожалуйста, опубликуйте использование автомата, которое не работает для вас. В противном случае см. Следующий пост, чтобы заставить его работать с другими именами свойств.

Использование Automapper, когда имена свойств отличаются

...