Проблемы контекста данных в ASP.NET EntityFramework 4 - PullRequest
1 голос
/ 09 октября 2010

Я работаю над сайтом, и в решении есть два проекта: проект бизнес-логики и проект веб-сайта. Я понимаю, что хочу сохранить контекст сущности вне веб-проекта и использовать только те бизнес-объекты, которые создает инфраструктура, но я не могу понять, как таким образом сохранить измененный объект.

Допустим, моя модель сущности создала этот класс:

public class Person //Person entity
{
    Int32 Id {get;set;}
    String Name {get;set;}
    Address Address {get;set;} //Address entity
}

И я создал этот класс, чтобы получить конкретного человека:

public static class PersonController
{
    public static Person GetById(int id)
    {
        using (Entities context = new Entities())
        {
            return context.Persons.FirstOrDefault(x => x.Id == id);
        }
    }
}

Это позволяет мне получить человека без контекста, вызвав PersonController.GetById (1); и я могу изменить свойства лиц после того, как получу их, но не могу понять, как сохранить измененную информацию обратно в базу данных. В идеале я хотел бы частично разделить класс Person и добавить метод .Save (), который будет обрабатывать создание контекста, добавление человека к нему и сохранение изменений. Но когда я попробовал это некоторое время назад, были все виды проблем, связанных с тем, что он все еще был привязан к старому контексту, и даже если я отсоединяю его и привязываю к новому контексту, он присоединяется как EntityState.Unchanged, если я правильно помню, поэтому когда я вызываю context.SaveChages () после его прикрепления, на самом деле ничего не обновляется.

Наверное, у меня есть два вопроса:

1) Пойду ли я об этом хорошо / есть ли лучший способ? Если я делаю это действительно ужасным образом, я был бы признателен за некоторый псевдокод, чтобы указать мне правильное направление; ссылка на пост, объясняющий, как действовать подобным образом, сработает так же хорошо.

2) Может ли кто-нибудь предоставить псевдокод для метода сохранения? Метод сохранения также должен обрабатываться, если адрес был присоединен или удален.

1 Ответ

2 голосов
/ 09 октября 2010

Есть много способов обработать Entity Framework как постоянный слой.

С одной стороны, похоже, что вы не используете чистые POCO.То есть вы позволяете EF генерировать классы для себя (в файле EDMX.designer.cs).

В этом нет ничего плохого, но это препятствует четкому разделению задач (особенно когда речь идет о модульном тестировании).).

Рассматривали ли вы реализацию шаблона репозитория для инкапсуляции вашей логики EF?Это был бы хороший способ изолировать логику от вашего пользовательского интерфейса.

С точки зрения сохранения - это то, где это становится трудным.Вы правы, большинство людей используют частичные занятия.Как правило, у вас есть базовый класс, который предоставляет виртуальный метод «Сохранить», который затем можно переопределить частичными классами.

Лично мне не нравится этот шаблон - я считаю, что POCO не следует заботиться о сохранении, илибазовая инфраструктура.Поэтому мне нравится использовать чистые POCO (без генерации кода), шаблон репозитория и единицу работы.

Единица работы управляет открытием / сохранением / закрытием контекста.

Вот как(моя) Единица Работы делает магию.Рассмотрим этот код в своем проекте "Web":

var uOw = new UnitOfWork(); // this is class i created, implementing the UOW pattern
var person = repository.Find(10); // find's a "Person" entity (pure POCO), with id 10.
person.Name = "Scott";
uOw.Commit();

Или добавление нового персонажа:

var uOw = new UnitOfWork();
var newPerson = new Person { Name = "Bob" };
repository.Add(newPerson);
uOw.Commit();

Насколько это хорошо?:)

В строке 1 создается новый контекст sql для вас.
В строке 2 используется тот же контекст для извлечения одного объекта «Person», который представляет собой код POCO, созданный вручную (не генерируется EF).
Строка 3 меняет имя Person (чистый установщик POCO).
Строка 4 Сохраняет изменения в контексте данных и закрывает контекст.

Теперь, есть еще много для нихшаблонов, поэтому я предлагаю вам ознакомиться с этими шаблонами, чтобы увидеть, подходит ли он вам.

Мой репозиторий также реализован с помощью Generics, поэтому я могу повторно использовать этот интерфейс для сохранения всех бизнес-сущностей.

Также взгляните на некоторые другие вопросы, которые я задавал о переполнении стека - и вы можете увидеть, как я реализовал эти шаблоны.

Не уверен, что это "ответ" вам "ищу, но подумал, что дам вам несколько альтернативных вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...