Один DataContext для Linq To SQL при использовании шаблона репозитория - PullRequest
1 голос
/ 29 января 2012

Я довольно новичок в разработке .NET C # и недавно начал использовать LINQ to SQL для большей части моего уровня доступа к данным. К сожалению, я боролся с тем, как управлять своим DataContext, чтобы я не получал страшные исключения, которые возникают из-за того, что сущности либо не присоединены к контексту, либо пытаются присоединить сущность к одному контексту, когда он присоединен к другому. После долгих чтений я считаю, что лучшее решение для моего приложения - оставить DataContext открытым на весь срок действия моего приложения.

Короче говоря, я использую шаблон Repository для реализации базовых операций CRUD (т.е. создания, чтения, обновления и уничтожения) для всех объектов, управляемых моим контекстом. Моя реализация репозитория включена ниже. В дополнение к репозиторию у меня есть DAO (объекты доступа к данным) для каждого объекта, который имеет более специфические методы доступа к данным (т. Е. CustomerDAO.getCustomerByName (имя строки) и т. Д.). Каждая из моих форм Windows имеет свой собственный экземпляр одного или нескольких DAO (которые расширяют репозиторий), а DataContext в моем репозитории является статическим. Проблема, с которой я сталкиваюсь, состоит в том, что, хотя мой DataContext в классе репозитория ниже объявлен как статический, я обнаружил, что каждый отдельный DAO фактически получает свой экземпляр DataContext. Например, если у меня есть 8 ссылок на CustomerDAO, все они имеют одинаковый DataContext. Но если я создаю один WorkOrderDAO, я получаю другой экземпляр DataContext, и все будущие экземпляры WorkOrderDAO получают этот же DataContext. Более конкретно, я обнаружил это в следующем сценарии.

1) Используйте экземпляр WorkOrderDAO для загрузки всех WorkOrders в ListView - имеет один DataContext 2) Используйте экземпляр WorkOrderJobsDAO, чтобы попытаться удалить одно из заданий в WorkOrder. Это коллекция на WorkOrder. Имеет другой DataContext, поэтому я не могу прикрепить

Это проблема с тем, как я реализовал репозиторий ниже? Единственное, что я могу придумать, чтобы решить эту проблему, - это создать Singleton, который репозиторий использует для получения своего DataContext. Кто-нибудь может дать какие-либо рекомендации здесь, как мне следует управлять контекстом?

public class Repository<T> : IRepository<T>
where T : class
{
    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    protected static DomainClassesDataContext db = new DomainClassesDataContext();
    private static bool dataContextOptionsInitialized = false;

    public Repository()
    {
        if (!dataContextOptionsInitialized)
        {
            db.DeferredLoadingEnabled = true;
            dataContextOptionsInitialized = true;
        }
    }
    public void AddEntity(T entity)
    {
        GetTable.InsertOnSubmit(entity);
        SaveAll();
    }

    public void DeleteEntity(T entity, bool attach)
    {
        if(attach)
            GetTable.Attach(entity);

        GetTable.DeleteOnSubmit(entity);
        SaveAll();

    }

    public void UpdateEntity(T entity, bool attach)
    {
        if(attach)
            GetTable.Attach(entity, true);
        SaveAll();

    }

    public System.Data.Linq.Table<T> GetTable
    {
        get { return db.GetTable<T>(); }
    }

    public IEnumerable<T> All()
    {
        return GetTable;
    }

    public void SaveAll()
    {
        db.SubmitChanges();

    }
}

1 Ответ

1 голос
/ 29 января 2012

Общие классы в C # расширяются при компиляции, поэтому ваш репозиторий будет отличным от Repository классом, поэтому статические переменные являются различными экземплярами в ваших DTO. Так что да, вы, вероятно, хотите сохранить его где-нибудь еще, как в классе Singleton.

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