Один DataContext для Linq To SQL при использовании шаблона репозитория

60
2

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

Короче говоря, я использую шаблон репозитория для реализации основных операций CRUD (т.е. Create, Read, Update и Destroy) для всех объектов, управляемых моим контекстом. Моя реализация Репозитория включена ниже. В дополнение к репозиторию у меня есть 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();

}
}

спросил(а) 2021-01-28T02:10:13+03:00 4 недели, 1 день назад
1
Решение
61

Родовые классы в С# получают "расширенные" в компиляции, поэтому ваш репозиторий будет другим классом, чем репозиторий, поэтому статические переменные представляют собой разные экземпляры между вашими DTO. Итак, да, вы, вероятно, захотите сохранить его в другом месте, например, в классе Singleton.

ответил(а) 2021-01-28T02:10:13+03:00 4 недели, 1 день назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема