1

Visual Studio で [新しい項目を追加] --> [Entity Data Model] の下でオブジェクト コンテキストを作成するときに、コードで行う方法はありますか?

たとえば、データベースに新しいテーブルを追加するとします。次回、そのデータベースのモデルを使用するアプリケーションをロードすると、モデルが更新され、その新しいテーブルのデフォルトの概念マッピングが自動的に作成されます。

おそらく、LINQ-To-Entities ではなく ESQL を使用してデータベースをクエリするので、新しいエンティティ セット/オブジェクトへの厳密に型指定されたアクセスがあるかどうかは気にしません。

また、このソリューションには最初に EF コードが必要ですか?

4

3 に答える 3

2

私の意見では、EDMXを使用したEFは、このシナリオに対応する準備ができていません。理由を明確にしましょう:

  • EDMXは、デザイナーが使用するファイルです。実行時に、EDMXファイルから生成された3つのXMLファイル(SSDL、MSL、およびCSDL)が必要です。これらのファイルはモデルを定義し、エンティティ接続文字列の一部です。
  • ObjectContextこれらのファイルで提供されるエンティティでのみ機能します。
  • 標準的なアプローチは、接続/コンテキストごとにこれらのファイルの単一のセットです。標準的なアプローチに従うと、テーブルの追加はこれらのXMLファイルの変更を意味するため非常に困難です(これらのファイルを個別にデプロイするアプローチを使用する必要があります-デフォルトのアプローチでは、これらのファイルをデータアクセスアセンブリ内のリソースとして使用します)。
  • EFをハックして、単一の接続ごとに複数のファイルを許可する方法を説明しましたが、お勧めしません。
  • メタデータファイルの個別のセットを作成する場合、新しいエンティティ(別の接続文字列)を操作するために別のコンテキストインスタンスが必要になり、これら2つのコンテキストはお互いを認識せず、他のエンティティにマップされたエンティティを使用できなくなります。
  • マッピングは話の一部にすぎません。次に、アプリケーションでエンティティを表すクラスが必要です。開発のためだけにこの「動的」な動作が必要な場合は問題ありませんが、実行時またはアプリケーションのリロード時にモデルにテーブルを追加するのは方法ではないようです-ORMツールでモデルを定義するのは実行時ではなく設計時です=必要です新しいエンティティを使用してアセンブリをコンパイルしました。これらの新しいエンティティを使用し、新しいアセンブリを参照するコードが必要です。

DefiningQueryは単なるデータベースクエリです。EFはこのクエリの結果セットにのみ関心があるため、データベース(または別のデータベース)に存在する任意のテーブルを使用できます。

最初にコードを使用すると、開発エクスペリエンスが大幅に向上します。コードは最初にEDMXファイルを必要としません-それはコードによって定義されたマッピングを使用します。EntityTypeConfiguration<>ブートストラップで事前定義された(または参照されたすべての)アセンブリから派生したすべてのタイプを収集するために、アプリケーションが必要になります。これらの構成はすべて、最初のコンテキストインスタンスを作成するときにに追加さDbModelBuilderれます。OnModelCreationアプリケーションを再起動し、エンティティを使用して新しいアセンブリを展開した後、新しいエンティティを簡単に使用できるコンテキストが得られます。それでも、このエンティティを使用するにはコードが必要です。DbSetを呼び出すことによってコンテキストクラスのプロパティとして公開するのではなく、手動で作成する必要がありますcontext.Set<EntityType>()。エンティティモデルの検証とデータベースの再作成をオフにする必要があり、すべてを自分で同期させる必要があるため、最初にコードでこれを行う場合には、いくつかの落とし穴があります。

それでも、新しいアセンブリをデプロイし、アプリケーションを再起動するとアセンブリを使用するシナリオについて説明しています。アプリケーション自体からテーブルと「エンティティ」を管理する必要がある場合は、ORMを直接使用するシナリオではありません。これは一部のメタデータモデル/マルチテナントシナリオの場合であり、ORMが一部の一般的な抽象テーブルに使用され、実際のエンティティが抽象として保存されたメタデータから構築されるというまったく異なる方法で行われます。

于 2011-06-18T14:21:06.333 に答える
0

.edmx ファイルはビジュアル スタジオ専用であり、アプリケーションの一部ではありません。メタデータは 3 つの xml ファイルに保存され、実行時に読み込むことができます。

http://blogs.msdn.com/b/alexj/archive/2010/01/27/tip-51-how-to-load-ef-metadata-from-an-arbitrary-stream.aspx

エンティティをクラスにマップする必要があり、そこが見苦しくなります。クラスは、reflection-api を使用して実行時に生成できます。または、StringProperty1、StringProperty2 などの多くのプロパティを持つジェネリック クラスを使用します。

この目的には、ESQL よりも SQL の方が適しています。

EF の学習: http://www.testmaster.ch/EntityFramework.test

于 2011-06-17T21:19:47.847 に答える
0

なぜ実際にこのようにしたいのですか?

これを可能にする方法がわかりません。エンティティ モデルを作成するときは、基本的に xml である edmx ファイルを実際に作成します。実行時にこれらの定義ファイルを変更することはできません。この edmx ファイルから、T4 テンプレートはコンテキストと .NET クラス/エンティティを生成します。私の知る限り、実行時にモデル/コンテキストにクラス定義を追加することはできません。

おそらく、この投稿は、未定義のテーブル/ビューから EF がエンティティを取得することについて、さらに洞察を与えることができます。そうでなければ、Ladislav Mrinka または Julie Lerman がこの質問に参加してくれることを期待しましょう ;)

まずEFコードについて。コードの最初のアプローチも edmx ファイル/エンティティ モデルですが、(データベースからエンティティ モデルを生成するのではなく) そこからデータベースを生成するため、違いはありません。最終結果は同じであり、機能しません。異なるランタイム。

于 2011-06-17T18:31:25.017 に答える