0

Code first アプローチで行われるように、データベースにマップされるカスタム Entity Framework (4.2) エンティティを作成しようとしています。

問題は、私のエンティティ フレームワーク データ モデルが最初にデータベースを使用していることです。

カスタム エンティティをエンティティ フレームワークのコンテキストに追加するにはどうすればよいですか?

4

1 に答える 1

1

データベースを最初に使用することで、既存のデータベースから作成された EDMX が既にあることを意味する場合は、最初にコードを使用することはできません。EDMX に含めるには、データベースからテーブルと更新モデル (EDMX) を作成する必要があります。

コメントに基づいて編集:

基本的に User の軽量バージョンである BriefUser エンティティを作成したいのですが、User の外部キーからプロパティを取得します。

これは可能です。BriefUser を共通クラスとして作成し、クエリでプロジェクションを使用することができます。

var breifUser = (from x in context.Users
                 where ...
                 select new BriefUser
                 {
                     // Fill BreifUser's properties here
                 }).FirstOrDefault();

以前のコードを再利用可能な拡張メソッドにリファクタリングすることもできます:

public static IQueryable<BriefUser> ProjectUser(this IQueryable<User> query)
{
    return query.Select(x => new BreifUser() 
                             { // Fill BreifUser's properties here });
}

次のように使用します。

var briefUser = context.Users.ProjectUser().FirstOrDefault(...);

新しいクラスを「エンティティ ビュー」として定義することもできます。最初の問題は、各テーブルが 1 つのエンティティ (継承や分割などの一部の高度な概念を除く) にしかマップできないため、BriefUser を新しいエンティティ タイプとして定義できないことUserです。QueryViewと呼ばれる特別な構造を使用する必要があります。BriefUserUserTbl

QueryViewマッピング レベルのビューです。EDMX の MSL 部分で直接定義された既存のマップされたエンティティの射影である新しいマップされた型を作成できます。プロジェクションは、カスタム Entity SQL クエリとして定義されます。問題は、QueryView制限があることです:

  • すべての Entity SQL 機能を提供しているわけではありません。たとえば、集計はサポートされていません (これは、本当に不足している機能だと思います)。たとえば、集計がないと、いくつかの関連エンティティをカウントするプロパティを含む新しいタイプを作成できません。
  • デザイナーではサポートされていません。EDMX を XML として編集して定義QueryViewし、Entity SQL クエリを自分で作成する必要があります。
  • 結果の型は「ビュー」であり、読み取り専用です。

EDMX ファイルを保持したいが、エンティティ (BriefUser) を EF のコンテキストに追加することもできます。

これは不可能です。あなたBreifUserはプロジェクション/ビューのみであり、EFは元のテーブルへの変更を追跡できないためBreifUser、コンテキストに追加して永続化することはできません。関連するすべてのテーブルを分解および変更する方法がないカスタムストアドプロシージャを定義すると、QueryViewそれを達成できます。BreifUserこれらのストアド プロシージャを EDMX にインポートし、ビュー エンティティのデータ変更操作にマップする必要があります。ところで。EF はすべてのビューを読み取り専用として取得するため、エンティティをデータベース ビューにマップすると同じことが起こります。

于 2011-11-28T10:34:03.863 に答える