Обработка DataContext в EntityFramework 4.0 - PullRequest
2 голосов
/ 06 февраля 2012

Есть ли какая-либо "лучшая практика" в отношении обработки Datacontext в Entity Framework 4?

В настоящее время я делаю что-то подобное в каждом окне:

public class MyWindow()
{
    MyEntities() _entities;
    MyWindow()
    {
        _entities = new MyEntities();
        InitializeComponent();
    }
}

и затем загрузка в сетку данных следующим образом:

    myGrid.ItemsSource= _entities.MyTable;

Это не очень умно, потому что ErrorHandling на этом невозможен.

Я бы лучше выбрал Connection-Class и сделал бы что-то вроде этого:

public class MyData()
{
    public IQueryable<Product> GetAllProducts()
    {
        using(MyContext context = new MyContext())
        {
           return context.Products;
        }
    }
}

Но сначала это создает новый контекст-экземпляр каждый раз - разве это не плохо?

Или мне лучше обрабатывать глобальный статический DataContext в моем Connection-Class? Разве эта статическая переменная не перегружена?

public class MyData()
{
    private static MyContext Context = new MyContext();
    public IQueryable<Product> GetAllProducts()
    {
      return Context.Products;
    }
}

1 Ответ

2 голосов
/ 06 февраля 2012

В рамках сущности ObjectContext / DbContext - это единица работы, срок их службы должен быть коротким.

Наличие статического контекста - это определенно нет-нет, так как при этом будет использоваться много памяти для объектов отслеживания изменений (каждый отслеживаемый объект изменений будет кэшироваться и сохраняться до удаления контекста).

Заключение контекста в использование, как, например, в вашем примере «Connection-Class», является правильным способом сделать это. Это часто называют услугой.

Пример сервиса:

public class ProductService
{
    public IEnumerable<Product> GetAllProducts()
    {
        using(MyContext context = new MyContext())
        {
            foreach(var product in context.Products)
                yield return product;
        }
    }
}

Обязательно вызовите либо ToArray() или ToList(), либо используйте yield return (как в моем примере) при возврате коллекции результатов в блоке, в котором будет расположен контекст. В противном случае это будет означать, что при использовании ваших результатов отложенное выполнение будет пытаться использовать удаленный контекст, что приведет к исключению во время выполнения.

...