Я довольно новичок в разработке .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();
}
}
Это веб-приложение или настольное приложение? – DOK
Это базовое настольное приложение, которое будет обрабатывать заказы на обслуживание и оценки для ремонта лодки. – Grasshopper
Было бы полезно пометить ваш вопрос с помощью WinForms или WPF, чтобы веб-разработчики не упали в обморок, когда увидели ваше предложение оставить DataContext открытым, а также привлечь ваше внимание на ваш вопрос. Я бы сбросил тег базы данных и заменил его на это. – DOK