2011-09-09 10 views
0

コードファーストアプローチを使用してEFを使用して基礎データベースを変更する方法はありますか?実行時にEntity Frameworkとコードを使用してデータベースを変更する

静的モデルを持つ2つのテーブルがあります。 ユーザーとInfo1。

私は病気info2を呼び出す別のテーブルもあります。

私のWebサイトの管理セクションからInfo2に列を追加したり削除したりできます。

私の目標は、ユーザがコーディングについて何も知らなくても、ユーザが好きなようにフィールドを追加したり削除したりすることで、動的に変更できるウェブサイトを持つことです。

私は、MVC3プロジェクトのモデルで指定されたデータベースの外に別のデータベースを使用することを検討しました。

これは、動的に作成されたフィールドとデータを持つテーブルを持つことによっても達成できますが、これは高速になります。

誰もこのようなことをしましたか?それは悪い考えですか?

+0

あなたは何を正確に達成しようとしていますか?テーブル 'info2'では、EFを使用してデータを取得する方法をどのように計画していますか?基礎となるDBの構造を反映したクラスがあると仮定しています。実行時にDBへの変更を反映するためにそれらを変更する計画はありますか? – itsmatt

+0

何を達成しようとしているのですか: 完全に動的な情報保存サイトを作るために、ユーザーがフィールドや新しいテーブルを追加できるような情報を格納できるシステム – JensB

答えて

0

ではなく、テーブルを水平方向に拡張しようとすると、意識的に意識して決定する必要があります。

代わりに、名前と値のペアとして値を格納することをお勧めします。特定の型を持つテーブルを持つことができます(つまり、キーと組み合わされた整数値が必要だったとしましょう)。次に、それらをユーザー用の辞書に選択します。

キー値を複製することに懸念がある場合は、キーを持つテーブルもあります。

たとえば、あなたはおそらく、一意のインデックスを配置したいと思います(文字列値用)UserDefinedStringテーブルを持っているでしょうUserDefinedKeyテーブル次に

UserDefinedKeyId (int, PK)  Key (varchar(?)) 
--------------------------  ---------------- 
         1  'My Website' 
         2  'My favorite color' 

UserDefinedStringId UserId  UserDefinedKeyId Value 
(int, PK)   (int, FK) (int, FK)   (varchar(max)) 
------------------- --------- ---------------- -------------- 
        1   1     1 'http://stackoverflow.com' 
        2   1     2 'Blue' 
        3   2     2 'Red' 

を持っていると思いますUserIdUserDefinedKeyIdのフィールドに、同じキーの複数の値を入力しないようにします(必要な場合は、別のテーブルを使用せずにユニークなnstraint)。

ユーザーの値を追加する場合は、UserDefinedKeyテーブルに値を追加し、そのテーブルとその値を保持する他のテーブルからロジックを削除します。

値を垂直に格納するもう1つの利点は、すべてのユーザーが使用していない値の列にスペースを浪費していないことです。

UserId WebSite     Color 
------ -------     ----- 
    1 http://stackoverflow.com Blue 
    2 (null)     Red 

は、今度は、第3のユーザが一緒に来て、Favorite Sports Team値を追加し、彼ら言わせて:あなたはなるだろう、上記の属性のために、あなたがテーブルを変更するアプローチをとると仮定すると例えば

、それを使用する唯一の1、表は、その後のように見えます:ユーザーの数として

UserId WebSite     Color FavoriteSportsTeam 
------ -------     ----- ------------------ 
    1 http://stackoverflow.com Blue (null) 
    2 (null)     Red (null) 
    3 (null)     (null) Yankees 

と属性成長し、あなたが持っているまばらなデータの量が劇的に増加します。

SQL Server 2008を使用していると仮定すると、sparse columnsを使用できます。そうしないと、テーブルが膨大になりますが、データは多くありません。

また、スパース列を使用しても、その場でスキーマを変更するのにdata definition language (DDL)を使用するのはかなり汚いという事実を払拭しません。

さらに、Entity Frameworkは、新しい属性を考慮してオブジェクトモデルを変更することはできません。属性を追加するたびに、その属性をオブジェクトモデルに追加し、再コンパイルして再デプロイする必要があります。

垂直アプローチでは、より多くの作業が必要ですが、無限に柔軟性があり、データベーススペースをより効率的に活用できます。

+0

これは私が気づいたバックアッププランです。問題は、100のフィールドと10のテーブルを持つと、データの概要を取得することが非常に困難になる可能性があるということです。 2年後に誰かが引き継ぎ、仕事をして他のシステムとの統合を可能にする必要がある場合はどうでしょうか。それは可能ですが、かなり面倒なことがあります。しかしこれはおそらく私がやっていく方法です) – JensB

+0

@ user937131:DDLをオンザフライで使用することの危険性や、そのアプローチを使用する際に直面する他の障害垂直アプローチと対比。 – casperOne

関連する問題