Контекст Entity Framework в синглтоне - PullRequest
3 голосов
/ 21 сентября 2011

Я создаю приложение, которое использует Context of EF в Singleton Pattern, как NHibernate, работает с Session:

public class DbContextFactory
{
    private static volatile DbContextFactory _dbContextFactory;
    private static readonly object SyncRoot = new Object();
    public DbContext Context;

    public static DbContextFactory Instance
    {
        get
        {
            if (_dbContextFactory == null)
            {
                lock (SyncRoot)
                {
                    if (_dbContextFactory == null)
                        _dbContextFactory = new DbContextFactory();
                }
            }
            return _dbContextFactory;
        }
    }

    public DbContext GetOrCreateContext()
    {
        if (this.Context == null)
            this.Context = new DbContext(ConfigurationManager.AppSettings["DefaultConnectionString"]);

        return Context;
    }
}

Я использую Ninject для добавления контекста:

public class DbContextModule : NinjectModule
{
    public override void Load()
    {
        Bind<IDbContext>().ToConstant(DbContextFactory.Instance.GetOrCreateContext());
    }
}

Я читаю об этом подходе, и некоторые люди говорят, что это плохая практика, и у меня будут проблемы.

Кто-то, кто знает об этом с EF, может объяснить мне более подробно?

Ответы [ 4 ]

3 голосов
/ 21 сентября 2011

NHibernate не использует Session как singleton ... Такой сценарий имеет смысл только в очень редких случаях, когда ваше приложение представляет собой очень короткий пакет, представляющий одну транзакцию / единицу работы.

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

0 голосов
/ 08 февраля 2018
public class Dock
{
    // Statik field
    private static Dock _dock;
    // lock object
    private static object lockObject = new object();

    // We prevent the constructive method from being modeled with new by 
    //making it secret.
    private Dock()
    {

    }
    // Class in Instance
    public static Dock Instance()
    {   
        if (_dock == null)
        {
            lock (lockObject)
            {
                if (_dock == null)
                    _dock = new Dock();
            }
        }
        return _dock;
    }

}

0 голосов
/ 06 мая 2014

Вы читаете эту статью.Почему вы не должны использовать одноэлементные DataContexts в Entity Framework?http://www.britishdeveloper.co.uk/2011/03/dont-use-singleton-datacontexts-entity.html

0 голосов
/ 21 сентября 2011

Хорошей практикой является использование текста данных на единицу работы. Чтобы получить больше информации о единице работы с EF, вы должны прочитать http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx

При совместном использовании одного и того же текста данных вы, вероятно, экономите несколько десятковмиллисекунды.На ум приходит слово микрооптимизация - в этом случае вам, вероятно, не следует использовать Entity Framework.

Наличие DataContext, который никогда не закрывается, позволяет вам лениво загружаться в любое время.Возможно, вы покинули службу и теперь находитесь в вашем контроллере или, что еще хуже, в вашем представлении.Доступ к базе данных из View требует проблем с производительностью, так как я уверен, что вы не допустили этого намеренно.Скорее всего, потому что вы забыли загрузить все данные, необходимые для заполнения вашего представления.

...