Code first アプローチで行われるように、データベースにマップされるカスタム Entity Framework (4.2) エンティティを作成しようとしています。
問題は、私のエンティティ フレームワーク データ モデルが最初にデータベースを使用していることです。
カスタム エンティティをエンティティ フレームワークのコンテキストに追加するにはどうすればよいですか?
Code first アプローチで行われるように、データベースにマップされるカスタム Entity Framework (4.2) エンティティを作成しようとしています。
問題は、私のエンティティ フレームワーク データ モデルが最初にデータベースを使用していることです。
カスタム エンティティをエンティティ フレームワークのコンテキストに追加するにはどうすればよいですか?
データベースを最初に使用することで、既存のデータベースから作成された 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と呼ばれる特別な構造を使用する必要があります。BriefUser
UserTbl
QueryView
マッピング レベルのビューです。EDMX の MSL 部分で直接定義された既存のマップされたエンティティの射影である新しいマップされた型を作成できます。プロジェクションは、カスタム Entity SQL クエリとして定義されます。問題は、QueryView
制限があることです:
QueryView
し、Entity SQL クエリを自分で作成する必要があります。EDMX ファイルを保持したいが、エンティティ (BriefUser) を EF のコンテキストに追加することもできます。
これは不可能です。あなたBreifUser
はプロジェクション/ビューのみであり、EFは元のテーブルへの変更を追跡できないためBreifUser
、コンテキストに追加して永続化することはできません。関連するすべてのテーブルを分解および変更する方法がないカスタムストアドプロシージャを定義すると、QueryView
それを達成できます。BreifUser
これらのストアド プロシージャを EDMX にインポートし、ビュー エンティティのデータ変更操作にマップする必要があります。ところで。EF はすべてのビューを読み取り専用として取得するため、エンティティをデータベース ビューにマップすると同じことが起こります。