2010-12-18 8 views
2

私はSteven Sandersonの優れた本 "Pro ASP.NET MVC 2 Framework"の提案されたリポジトリパターンに従ってプロジェクトを進めています。LinqからSQLへのリポジトリパターン:多対多の関係

次の例を考えてみます。私は「製品」と「イメージ」のテーブルを持っています。両方とも、コンストラクタに新しいDataContextを作成する独自のリポジトリを持っています。今、「ImagesForProducts」という2つのエンティティ間に多対多の関係を確立したいと考えています。

ImagesForProductsエンティティ用の別個のリポジトリを作成する必要がありますか?もしそうなら、どのようにすべてのエンティティ間でDataContextを共有できますか?その場合、2つのリポジトリ(ProductsおよびImagesForProducts用)を使用してProductControllerをインスタンス化する必要があります。

myProduct.AddImage(img)を書くことができるように、自分の製品インスタンスを使用して画像にアクセスしたいと思います。しかし、ProductRepositoryを使用してデータベース内の関係をどのように維持することができますか?

全体的なアーキテクチャについてはわかりませんが、基本的なコード例を高く評価しています。

ありがとうございます!

答えて

1

、私はリポジトリに製品インスタンスの代わりにイメージの添付ファイルを処理させることにしました(主にインスタンスがデータベース関連のものを扱わないようにするため)。

LinqからSQLへのマッピングを使用しているので、既にImagesForProductsエンティティを取得しています。そこで私は、そのタイプのテーブルを製品リポジトリに追加しました。これを製品リポジトリの現在のDataContextで開始することができます。その方法は、両方のインスタンスは常に共有のDataContextを使用して、私は単純に、このような方法で「AttachImageToProduct」を実装することができます

public class MsSqlProductsRepository : MsSqlRepository<Product>, IProductsRepository 
{ 
    protected Table<ImagesForProducts> imageRelationsTable { get; set; } 

    public MsSqlProductsRepository(string connectionString) 
     : base(connectionString) 
    { 
     imageRelationsTable = DataContext.GetTable<ImagesForProducts>(); 
    } 

    public void AttachImageToProduct(Image image, Product product) 
    { 
     if (imageRelationsTable.First(r => r.ImageId == image.Id && r.ProductId == product.Id) != null) 
      return; 

     ImagesForProducts rel = new ImagesForProducts(); 
     rel.ImageId = image.Id; 
     rel.ProductId = product.Id; 

     imageRelationsTable.InsertOnSubmit(rel); 
     entitiesTable.Context.SubmitChanges(); 
    } 
} 

あなたはこのソリューションについての一般的な懸念を持っていますか?

0

ドメインオブジェクトのインメモリストアを表すには、リポジトリパターンを使用する必要があります。あなたのドメインモデルが永続性の内部を知らず、集約されたルートの周りに設計されたすべてを持っていることを望むので、ImagesForProductsエンティティを持つことは理にかなっていないため、ImagesForProductsエンティティ用の別個のリポジトリを持つことは意味がありません。

まず、永続化シナリオ(LINQ to SQL、EF、Stored Procedures ..)で使用できるPOCOオブジェクトを使用してドメインモデルを構築することをお勧めします。 2つのリポジトリ(ProductRepositoryとImageRepository)しかなく、両方のドメインオブジェクトの多対多関係を「リレーショナル」プロパティとして解決する必要があります。たとえば、イメージコレクションをProductドメインオブジェクトに追加し、ProductコレクションをImageドメインオブジェクトに追加することができます。 POCOオブジェクトをビルドすると、リポジトリ内の特定の永続ストアへのマッピングを処理できます(コンストラクタ内にあることが好ましい)。

あなたがplubmingを実装すると、次のことができ、製品に画像を追加:

product.Images.Add(image); 

その後、あなたはこのようなあなたのリポジトリを呼び出すことができますいくつかの入念な調査と検討した後

productRepository.Add(product); 
+0

あなたの答えをありがとう。 Linqのマッパーは、Linq関連のリポジトリでのみ使用され、私のモデルにとっては重要ではないので、私に心配していないImagesForProductsの権限を既に与えています。私の答えでわかるように、最終的には、製品インスタンスを使用してイメージを追加しないことにしました。そうすれば、私の「本当の」モデルエンティティは、データベース関連のものとは関係がありません。 – Shackles