次のような(非常に単純化された)システム(少しDDDのような)でLinq to SQLの使用を開始しました。
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 を使用します。
- 私は本当にこれをしたくありません。理由は、アプリがリポジトリを意識したくないからです。もう 1 つは、linq2sql を COM で可視化するのは良いことだとは思わないということです。
- また、私が
context.SubmitChanges()意図したよりも多くのことをコミットする可能性が高いと思います。
- 関連する要素をフェッチするための DataLoadOptions を指定します。
- 場合によっては、ビジネス ロジック レイヤーがいくつかのエンティティで応答するようにしたいので、どのサブ プロパティを使用する必要があるかわかりません。
- すべてのプロパティの遅延読み込み/遅延読み込みを無効にします。
- かなりの数のテーブルがあり、それらは強くリンクされているため、オプションではありません。これにより、多くの不要なトラフィックとデータベースの負荷が発生する可能性があります。
- インターネット上のいくつかの投稿では、.Single() を使用すると役立つはずです。
- どうやらそうではありません...
この悲惨さを解決する方法はありますか?
ところで: Linq t0 SQL を使用することにしたのは、それが比較的軽量な ORM ソリューションであり、.NET フレームワークと Visual Studio に含まれているためです。.NET Entity Framework がこのパターンにより適している場合は、それに切り替えるオプションになる可能性があります。(実装はまだそこまで進んでいません。)