2012-04-16 6 views
2

MVCパターンのモデルデザインに問題があり、静的型のC#でスタックされています。LINQモデルの一般化

私がやりたいことは、すべてのデータベースの挿入、更新、削除操作を行うクラスのグループを作ることです。このグループは、データベースの各テーブルからマップされるクラスのサブグループと、テーブルクラスにアクセスするテーブルモデルクラスのサブグループで構成されます。

私はテーブルクラスを作成するために、LINQのマッピングを使用しています。何の問題もなく正常に動作します

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

using System.Data.Linq; 
using Iris.Models.Tables; 
using Iris.Models.DataContexts; 

namespace Iris.Models 
{ 
    public class UserModel 
    { 
     private UserDataContext dataContext; 
     private Table<Users> users; 

     public UserModel() 
     { 
      this.dataContext = new UserDataContext(Config.CONNECTION_STRING); 

      this.users = this.dataContext.GetTable<Users>(); 
     } 

     public List<Users> Select() 
     { 
      var data = from user in this.users select user; 

      return data.ToList<Users>(); 
     } 

     public Users Select(object id) 
     { 
      var data = from user in this.users where user.User_Id.ToString() == id.ToString() select user; 

      return data.ToList<Users>()[0]; 
     } 

     public void Insert (Users user) 
     { 
      this.dataContext.Users.InsertOnSubmit(user); 

      this.dataContext.SubmitChanges(); 
     } 

     public void Update(Users user) 
     { 
      var queryableData = from row in this.dataContext.Users where row.User_Id == user.User_Id select row; 

      var editedData = queryableData.Single<Users>(); 

      editedData.User_Id = user.User_Id; 
      editedData.Name = user.Name; 
      editedData.Password = user.Password; 
      editedData.Userlevel_Id = user.Userlevel_Id; 

      this.dataContext.SubmitChanges(); 
     } 

     public void Delete(Users user) 
     { 
      var queryableData = from row in this.dataContext.Users where row.User_Id == user.User_Id select row; 

      var deletedData = queryableData.Single<Users>(); 

      this.dataContext.Users.DeleteOnSubmit(deletedData); 

      this.dataContext.SubmitChanges(); 
     } 
    } 
} 

コードの組を超えるが、私がしたい:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

using System.Data.Linq.Mapping; 
using Iris.Libraries; 

namespace Iris.Models.Tables 
{ 
    [Table] 
    public class Users 
    { 
     [Column(IsPrimaryKey = true)] 
     public string User_Id; 

     [Column] 
     public string Name; 

     [Column] 
     public string Password; 

     [Column] 
     public int Userlevel_Id; 

     public Users() 
     { 
     } 
    } 
} 

その後、モデルクラスによってアクセステーブルをデータベースにテーブルがたくさんあるので、モデルクラスの 'ほぼ同じ'コードを何度も書くのを避けるためです。その目的を達成するために、私はモデルの一般化されたクラスとそれから拡張されたすべてのテーブルモデルを作成しようとします。

public class Users : Model {} 

問題は、各テーブルには常に異なる表<内のクラス>は

private Table<Users> users; 

から来ています。私は数日間捜し求めていましたが、この問題を解決するための答えは見つかりませんでした。

上記のようなテーブルモデルを一般化することは本当に不可能ですか?あるいは同じコードを繰り返し書くことを避けるための他の方法がありますか?誰もが、私を助けてください.. :(

+1

おそらくあなたは[リポジトリパターン](HTTPを探している「それは我々が自分自身を設計されたデータベースだ、それは近い将来に多くのことをするつもりの変更はありません」 .com/eaaCatalog/repository.html)。 – Steven

+0

これはDataContextメソッドへのショートカットです。同じことを行うためにDataContextにいくつかの汎用メソッドを追加することができます。難しいのは、インターフェースの主キーを統一し、更新のためにエンティティをDataContextに再接続することです。 @Stevenが提案したように、リポジトリパターンを使用しているORMでもっと幸せになれます。 – Guillaume86

答えて

0

次の一般的な方法で使用してください:あなたの一般的なリポジトリモデル次に

public interface IRepository<T> where T : class 
{ 
    void Add(T entity); 
    void Delete(T entity); 
    void Update(T entity); 
    IEnumerable<T> GetAll(Func<T,bool> exp); 
    .... 
} 

必要があります:最初の一般的なインタフェースを作成し、あなたが​​を使用することができます

System.Data.Linq.Table<T> GetTable 
{ 
     get { return _db.GetTable<T>(); } 
} 

を次のようになります。

public class Repository<T> : IRepository<T> 
    where T : class, IEntity 
{ 
    DataContext _db; 
    public Repository() 
    { 
     _db = new DataContext("Database Connectionstring"); 
     _db.DeferredLoadingEnabled = false; 
    } 
    System.Data.Linq.Table<T> GetTable 
    { 
     get { return _db.GetTable<T>(); } 
    } 
    public IEnumerable<T> GetAll(Func<T, bool> exp) 
    { 
     return GetTable.Where<T>(exp); 
    } 
    ... 
    . 
} 
+0

私はいつも好奇心が強いです...このようなアプローチでは、モデラーのデータ型を呼び出し元に認識させる必要があり、モデリング自体の目的を破ってしまいます。 (文句についてはわからないが、私の疑問がはっきりしないことを願う) – Alex

+0

Mahmoud Gamalさん、ありがとうございます。あなたのソリューションは私のために働く。私のプロジェクトにはたくさんのモデルがあります。そのリポジトリパターンでは、私は各モデルのための多くの繰り返しコードを書く必要はありません。 – yunhasnawa

0

一度私たちの会社。

モデルを一般化しようとせずに、各テーブルに非常に似たコードを書くという「最悪の」アプローチを選択しました(基本的に、回避したいアプローチを採用しました)。

アプローチは非常に悪いと感じましたが、メソッドとプロパティの重複した区別のために、これまでどおりデバッグするのに苦労していました。また、かなり高速に展開することができます。あなたがする必要があるのは、違いをコピーして貼り付け、微調整するだけです。

EDIT://マーティン・ファウラー:この選択の背後にある主な理由だった