2016-12-22 7 views
0

DbSetのさまざまな実装を見てきましたが、私が探しているものではないかと思います。汎用関数を使用してEF5でDBSetを照会する

基本的に、私たちはEb5コード・ファースト・アプローチで一連のDbSetをセットアップしています。私は、DBに入っているレコードに対してAPIに入ってくる更新/投稿をチェックするコードを書いて、新しいレコードの場合にのみ更新/投稿されるようにします。

これらのDBSetのそれぞれに同じコードを記述したくないのは明らかです。引数/パラメータとしてDbSetを取り込み、そのDBSetをチェックできる単一のクラス/関数を記述したいと思います記録のために。それはエンドユーザーに依存し、彼らがDbSetを照会する必要がありますどのへと行っているあるので、それは、例えば、私はコールのような何かをしたいので...動的にする

を必要とします:

CheckDbUniqueRecord(Contracts) Contractsは、フォームから渡される契約モデルのDbSetです。

だからモデルでは、我々はpublic class Contract

と我々が持っているMainDbContextを持っている私は、任意の上で重複するレコードをチェックするために同じコードを実行できるようにしたいpublic DbSet<Contract> Contracts {get; set;}

そのうちの1つは、複数のDbSetさんその特定のコントローラから返されているクラス/モデルをその1行の関数で単純に渡すことで、私たちが持っているDbSetsの値を返します。

私はこれを達成する方法があると知っています。 C#からエラーが発生し、型が一致しないなどのエラーが発生します。

ご協力いただければ幸いです。

更新:DBの重複したレコードに対してのみチェックする必要があります。更新するためではありません。私はPut関数を呼び出す前に、クライアント側で検査の更新を処理します。

私は非常に近く働いている次のコードを持っている。しかし、私はメソッド呼び出しでエラーを取得しています、汎用的な制約を使用することにより

public interface getId 
     { 
      int Id { get; set; } 
     } 
     public class Check : getId 
     { 
      public int Id { get; set; } 

      public static bool CheckDBUniqueRecord<T>(T entity) where T : class, getId 
      { 
       MainDbContext db = new MainDbContext(Utility.PortalConnectionString()); 

       var myDbSet = db.Set<T>().ToList(); 

       foreach (var d in myDbSet) 
       { 
        d.Id = 0; 
        if (d == entity) return true; 

       } 
       return false; 


      } 
     } 

を:タイプxxxxが型パラメータ「Tとして使用することはできません'一般的な方法でyyyyyy。 xxxxからyyyyへの暗黙的な参照変換はありません。

この問題を修正しますか?

+0

つまり、データベース内に存在する任意のエンティティをチェックする一般的な方法が必要ですか?どのようにして小切手が行われると思いますか?どのフィールドを比較に含めるかをどのように決定したいですか?メンバーの属性? id以外のすべてのフィールド? – DarkSquirrel42

+0

Genericメソッドを使用して開始する必要があります。次に、typeof(T)を使用してTをクラスとし、各タイプを具体的なメソッドに抽象化したり、Tに対してリフレクションを使用してオブジェクトのプロパティを取得したり、それを使って更新を保存するなどしてください。どのタイプのCRUDを作成する必要があるかを判断するには、何かを汎用メソッドに渡す必要があります。シンプルな単一の主キーオブジェクトから始め、その後、より複雑な型のオーバーロードメソッドを作成することができます。 – bilpor

+0

はい、エンティティは常にDBに存在するため、これは問題ではありません。チェックはすべてのフィールドに対して実行されます...基本的に私はDBレコードの各フィールドをループし、渡されるモデルの値をチェックします。すべてのフィールドが同じ場合、ポスト/更新は実行されません。変更されたフィールドを見つけたら、ループから抜け出し、ポスト/アップデートを実行します。私は実際には記事のためだけにそれを必要としています。なぜなら、更新を実行する前にクライアント側の更新をチェックするからです。したがって、基本的には、DBに重複レコードがないことを確認するだけです。 – MattE

答えて

0

まず最初にすること:このすべてがちょうどダウン書かれており、テストされていないさ...

最初は単純です:あなたの関数の署名...

public static bool CheckDbUniqueRecord<T>(T entity) 

またはextensionmethodのような似たような。 ..

public static bool CheckDbUniqueRecord<T>(this DbContext db, T entity) 

基本的にあなたが何をしたいのか、あなたのエンティティに対応するDbSetのためのあなたのDbContextを照会することです...

var myDbSet = db.Set<T>(); 

これで、確認したいプロパティを見つけるために何らかのロジックが必要になりました...あなたのエンティティのクラスメンバに属性を設定することによって行うことができます。これは、主キーフィールドではないものをすべてチェックすることによって行うことができます。テストするものを教えてくれる何かを考え出す必要があります...この答えを簡単にするために、私はちょうど "ID"という名前ではないゲッターを持つすべてのプロパティに行くいくつかの非常に単純なことを持っています...あなたの実装に応じて、おそらくこのコードのいくつかを初期化毎回実行されていないコードブロック...

+0

識別子Iを知っているので、 DBを検索してMemberIdを検索すると、レコードが返されます。各レコードの各列をループし、レコードの列と比較します。 – MattE

+0

メンバーIDと一致するすべてのエンティティをマテリアライズします?そのようなレコードが存在するかどうかを知りたければ、DBMSに尋ねてください....あなたが知りたいことは、SELECT count(*)> 0 FROM ... WHERE Property1 = 'Value1' AND Property2 = 'Value2 '... – DarkSquirrel42

関連する問題