Я довольно новичок в разработке .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();
}
}