2012-01-28 4 views
1

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

Короче говоря, я использую шаблон репозитория для реализации основных операций 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(); 

    } 
} 
+0

Это веб-приложение или настольное приложение? – DOK

+0

Это базовое настольное приложение, которое будет обрабатывать заказы на обслуживание и оценки для ремонта лодки. – Grasshopper

+1

Было бы полезно пометить ваш вопрос с помощью WinForms или WPF, чтобы веб-разработчики не упали в обморок, когда увидели ваше предложение оставить DataContext открытым, а также привлечь ваше внимание на ваш вопрос. Я бы сбросил тег базы данных и заменил его на это. – DOK

ответ

1

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

+0

Спасибо, я создал класс Singleton, который теперь сохраняет контекст, который, как я думаю, будет работать для моего текущего дизайна. В целом, делает ли эта реализация смысл, как я реализую уровень доступа к данным? В принципе, все мои DAO расширяют репозиторий и добавляют дополнительные методы доступа к данным. Было бы лучше отбросить родовой класс и написать общее dao, в котором есть linq-запросы внутри него для выполнения основных операций? Я все еще пытаюсь ознакомиться с этими родовыми классами. – Grasshopper

Смежные вопросы