Я начал использовать Linq to SQL в (битовой DDD) системе, которая выглядит (слишком упрощенно) так:
public class SomeEntity // Imagine this is a fully mapped linq2sql class.
{
public Guid SomeEntityId { get; set; }
public AnotherEntity Relation { get; set; }
}
public class AnotherEntity // Imagine this is a fully mapped linq2sql class.
{
public Guid AnotherEntityId { get; set; }
}
public interface IRepository<TId, TEntity>
{
Entity Get(TId id);
}
public class SomeEntityRepository : IRepository<Guid, SomeEntity>
{
public SomeEntity Get(Guid id)
{
SomeEntity someEntity = null;
using (DataContext context = new DataContext())
{
someEntity = (
from e in context.SomeEntity
where e.SomeEntityId == id
select e).SingleOrDefault<SomeEntity>();
}
return someEntity;
}
}
Теперь у меня проблема. Когда я пытаюсь использовать SomeEntityRepository, как это
public static class Program
{
public static void Main(string[] args)
{
IRepository<Guid, SomeEntity> someEntityRepository = new SomeEntityRepository();
SomeEntity someEntity = someEntityRepository.Get(new Guid("98011F24-6A3D-4f42-8567-4BEF07117F59"));
Console.WriteLine(someEntity.SomeEntityId);
Console.WriteLine(someEntity.Relation.AnotherEntityId);
}
}
все работает хорошо, пока программа не дойдет до последней WriteLine, потому что она выдает ObjectDisposedException
, потому что DataContext больше не существует.
Я вижу реальную проблему, но как мне ее решить? Я думаю, что есть несколько решений, но ни одно из тех, о которых я думал до настоящего времени, не будет хорошим в моей ситуации.
- Отойдите от шаблона хранилища и используйте новый DataContext для каждой элементарной части работы.
- Я действительно не хотел бы этого делать. Причина в том, что я не хочу, чтобы приложения были осведомлены о хранилище. Другая причина в том, что я не думаю, что было бы неплохо сделать linq2sql с видимым COM-содержимым.
- Кроме того, я думаю, что выполнение
context.SubmitChanges()
, вероятно, совершит гораздо больше, чем я намеревался.
- Указание DataLoadOptions для выборки связанных элементов.
- Поскольку я хочу, чтобы мой уровень бизнес-логики в некоторых случаях просто отвечал с некоторыми объектами, я не знаю, какие подчиненные свойства им нужно использовать.
- Отключение отложенной загрузки / отложенной загрузки для всех свойств.
- Не вариант, потому что таблиц довольно много и они тесно связаны между собой. Это может привести к большому количеству ненужного трафика и загрузке базы данных.
- В некоторых постах в интернете говорилось, что использование .Single () должно помочь.
Есть ли способ решить эту проблему?
Кстати: мы решили использовать Linq t0 SQL, потому что это относительно легкое решение ORM и входит в состав .NET Framework и Visual Studio. Если .NET Entity Framework будет лучше вписываться в этот шаблон, возможно, будет возможность перейти на него. (Мы еще не так далеко в реализации.)