2017-08-09 10 views
0

C#およびEntity Frameworkの新機能です。データベースクラスのフィールドと初期化に関する質問があります。データベースクラスインスタンス、フィールド、エンティティフレームワーク

私は先生からEntity Frameworkを介してMySQLデータベースに接続しているプログラムでいくつかのコードを受け取りました。

これまでは、データベースに物を追加するための内部メソッドを最初に作成した例を見てきました。今まで見たことの例:

using (var db = new p4_databaseEntities()) 
     { 
      cp_car carEntity = new cp_car(); 
      carEntity.make = car.make; 
      carEntity.model = car.model; 
      carEntity.year = car.year; 

      db.cp_car.Add(carEntity); // 
      db.SaveChanges(); 

      MessageBox.Show("A Car has been added"); 

     } 
     this.Close(); 

cp_carはデータベース内のテーブルであり、プログラム内のクラスです。 dbはデータベースの現在のインスタンスです。

今、私が受け取ったコードでは、これはこのように行われていません。それは別の問題で行われます。 BtwプログラムはWindowsフォームです。

最初のフォームウィンドウで、コンストラクタ内でデータベースの新しいインスタンスを作成し、LinqQueriesという別のクラスのinit というメソッドを呼び出します。そのためのコード:

public Form1() 
    { 
     InitializeComponent(); 


     p4_databaseEntities db = new p4_databaseEntities(); 
     LinqQueries.Init(db); 

     this.CenterToScreen(); 
    } 

LinqQueriesクラスがどのように見えるか:

 private static p4_databaseEntities _db; 

    public static void Init(p4_databaseEntities db) 
    { 
     _db = db; 
    } 

私は彼が、彼はまた、initメソッドで呼び出されるコンストラクタ、データベースの新しいインスタンスを作成し理解しています。このメソッドは、dbオブジェクトを_dbとして定義しました。現在、彼はデータベースにデータを追加または削除するたびに、彼はdbではなく_dbを使用しています。

私の質問は、これは、initメソッドがp4_databaseEntities型(データベースクラスの名前)の静的フィールドをオブジェクトとして割り当てることを意味しますか? _dbの値はオブジェクトですか?オブジェクトへの参照ですか?また、データベースに変更を加えたときに同じフィールドを何度も繰り返し使用していることに気がつきました。これにより、プログラムの寿命を延ばすことができないアクティブなオブジェクトである可能性があります。

誰でもこれを明確にすることができれば大いに感謝します。何らかの間違いがあった場合は、間違いや誤った言い訳を言い訳してください。 C#とEntity Frameworkの新機能です。

ありがとうございます。

+0

誰がコードを書いたのですか?著者に尋ねることができますか? – mjwills

答えて

0

あなたの説明は少し間違っています。これは混乱の原因となります。

DbContextはデータベースではなく、データベースへの接続を表します。 DbContextオブジェクトを作成すると、DbSetに記述されているエンティティを介してデータベース内のテーブルにアクセスできます。

DbSetはデータベース内のテーブルを表しているようですが、そうではありません。たとえば、DbSetを使用してアクセスするエンティティは、ICollectionをメンバーとして持つことができます。メンバーには、テーブルの一部ではなく異なるテーブルのアイテムが含まれます。このICollectionの項目にアクセスすると、結合を入力することなくSQL結合が実行されます。

したがって、DbConnectionのDbSetオブジェクトはデータベーステーブルを表しません。これは、アクセス可能なプロパティへのアクセスを表しますDbSetオブジェクトとの関係を持つテーブル内のデータベース内のすべてのオブジェクトのプロパティを含むDbSetオブジェクト。

usingステートメントの最初のコードは、エンティティフレームワークを使用する通常の方法です。

データベースのデザインを非表示にするために、DbContextを使用する唯一のクラスである別のクラスが導入されることがよくあります。データベースのすべてのユーザーは、別のクラスを使用して通信する必要があります。

これにより、データベースを使用するコードを変更することなく、データベースの内部を変更することができます。

これはおそらくLinqQueriesクラスの目的であると思われます。 DbContextの関数を直接呼び出すのではなく、LinqQueries(おそらく静的)関数を呼び出す必要があります。このようにして、LinqQueries関数の呼び出し元を変更することなく、データベースの内部構造を変更できます。

実際には、LinqQueriesは1つのDbContextと通信することを意図しています。 LinqQueriesは、どのDbContextが使用されているかを決定しません。適切な機能は、DbContextとInit LinqQueriesを作成する必要があるLinqQueryの1人のユーザーに大きく依存します。この1人のユーザは、DbContextをDispose()する必要があるため、誰もLinqQueriesを必要としないことを知っておく必要があります。

かなり設計されています。デザイナーが非常に独創的な製品を作っているとすれば、彼の製品は多くのユーザー(ソフトウェアを意味し、オペレーターではありません)によって使用されます。正確に1人のユーザーがInit関数を呼び出すと主張しますか?

すべてのユーザーが同じDbcontextを使用したい場合は、LinqQueriesのコンストラクタにこのDbContextを作成させてください。実際、デザインはシングルトンのデザインパターンと似ています。だから、LinqQueryをシングルトンとして作成してみませんか?

LinqQueryのすべてのユーザーが同じものを使用し、DbContextのみがLinqQueryクラスの使用を不必要に制限するという制限があります。

LinqQueryクラスのユーザーがコンストラクタにDbContextを渡すことができた場合、ユーザーはこの特定のLinqQueriesオブジェクトで使用するデータベースを決定できます。単体テストを作成するときには、これは非常に便利です。元のデータベースを使用する代わりに、特定のテスト値を持つデータベースでテスト可能なコードを使用できます。

デザイナーの目標は不明です。 IMHOそれは悪いデザインであり、何が起こるかははっきりしないことが正しいです。

class LinqQueries 
{ 
    // default constructor: use the default DbContext 
    public LinqQueries() 
    { 
     this.DbContext = new p4_databaseEntities(); 
    } 

    // special constructor: user provided dbContext 
    public LinqQueries(p4_databaseEntities dbContext) 
    { 
     this.dbContext = dbContext; 
    } 

    private readonly p4_databaseEntities dbContext; 

    public IEnumerable<...> GetMyElements(...) 
    { 
     return this.dbContext....; 
    } 
} 

この方法で、LinqQueriesのすべての作成者は、正確に何をすべきか知っているいずれかのデフォルトp4_databaseEntitiesを使用するか、または独自のDbcontextを作成して、もう

using (var mydbContext = new p4_databaseEntities()) 
{ 
    LinqQueries linqQueries = new LinqQueries(myDbContext); 
    // note that this constructor is very lightWeight! 

    var result = linqQueries.MyQeury(...); 
} 

必要でない場合は、この方法が本当に安全であることを処分するだろう。私が行ったエラーは、LinqQueryクラスの他のユーザーのコードには影響しません。

+0

ご迷惑をおかけいたします。私は実際に何が起きているのかを理解するために、コードの作者と話をします。 –

関連する問題