コードファーストエンティティフレームワークでビューを使用する方法[クローズ]


87

最初にエンティティフレームワークコードでデータベースビューを使用するにはどうすればよいですか?


2
以下の回答はいずれも、EF移行を使用してビューを作成する方法を説明していません。同様の質問については、この回答を参照してください。
Rudey 2017

これはまったく同じ質問のスレッドです。- stackoverflow.com/questions/13593845/...
本部Tiwariさん

私の解決策を試してください。ビューとしてマークされたテーブルの移行生成を防止します
kogoia

回答:


95

私のように、他のデータベース(私の場合はerp)からのエンティティをマッピングして、それらをアプリケーション固有のエンティティに関連付けることにのみ関心がある場合は、テーブルを使用するときにビューを使用できます(ビューをマッピングする同じ方法!)。明らかに、そのエンティティを更新しようとすると、ビューが更新可能でない場合に例外が発生します。手順は、通常の(テーブルに基づく)エンティティの場合と同じです。

  1. ビューのPOCOクラスを作成します。たとえばFooView
  2. DbContextクラスにDbSetプロパティを追加します
  3. FooViewConfigurationファイルを使用して、ビューに別の名前を設定するか(コンストラクターでToTable( "Foo");を使用)、または特定のプロパティを設定します

    public class FooViewConfiguration : EntityTypeConfiguration<FooView>      
    {
        public FooViewConfiguration()
        {
            this.HasKey(t => t.Id);
            this.ToTable("myView");
        }
    }
    
  4. FooViewConfigurationファイルをmodelBuilderに追加します。たとえば、ContextのOnModelCreatingメソッドを確認します。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new FooViewConfiguration ());
    }
    

64
「コードファースト」を想定しない場合の+ 1 ==自動データベース生成
onetwopunch 2012年

3
@DaveJellisonは、詳細を説明するか、IDatabaseInitializerの一部としてビューを追加するためのリンクを提供しますか
Ralph Shillington

18
それは私だけですか、それとも移行によって作成された空のテーブルを誰もが取得していますか?それを回避する方法はありますか?
Kremena Lalova 2015

4
ここで確認してください。このソリューションでは、事前に外部でSQLデータベースにビューを作成する必要がありますか?コードでビューを定義し、Add-Migration / Update-Databaseコマンドを使用してデータベースに入力することは可能ですか?
frostshoxx 2015年

6
いくつかのこと。1.この回答では、SQLを使用して手動でビューを作成する必要があるとは述べていません。これは、移行を使用して行うことができます。2.クラス名がビュー名と一致する場合は、ビュー名を構成する必要はありません。3.次のようにDataAnnotationsを使用できます。[Table("myView")]これは、作成を使用するよりも間違いなく簡単ですEntityTypeConfiguration
Rudey 2017

23

これは更新かもしれませんが、EFコードでビューを使用するには、最初に[Table( "NameOfView")]をクラスの先頭に追加するだけで、他のすべての人が経験しているすべてのフープを経験しなくても、すべてが正しく機能するはずです。また、列の1つを[キー]列として報告する必要があります。これを実装するためのサンプルコードを以下に示します。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace SomeProject.Data
{
    [Table("SomeView")]
    public class SomeView
    {
        [Key]
        public int NameID { get; set; }
        public string Name { get; set; }
    }
}

そして、これがコンテキストの様子です

using System.Data.Entity;

namespace SomeProject.Data
{
    public class DatabaseContext : DbContext
    {
        public DbSet<SomeView> SomeViews { get; set; }
    }
}

2
これは、承認された回答がEF Fluid APIを使用するのに対し、これはDataAnnotationsを使用することを除いて、承認された回答と同じです。
Rudey 2017

4
実際にはそうではありません。受け入れられた答えを試してみましたが、うまくいきませんでした。しかし、私は移行を使用しているので、これは物事に影響を与えた可能性があります。最初に移行を実行してから、データベースに既に存在するビュークラスを追加する必要があることがわかりました。データベースに既存のテーブルがすでにある場合は、まったく同じ方法で処理します。ビューは「仮想テーブル」であるため、EntityFrameworkのテーブル構文は引き続き機能します。
チャールズオーウェン

11

正規化されていないオブジェクトの束だけが必要な場合はIQueryable<TDenormolized>DbContextクラスにパブリックget-onlyプロパティを作成しただけかもしれません。

get、Linqの結果を返し、非正規化された値を非正規化されたオブジェクトに投影します。これは、プログラミングを行っているため、DBビューを作成するよりも優れている場合がありますselect。ステートメントの使用だけに制限されるわけではありません。また、コンパイル時のタイプセーフです。

ToList()呼び出しなどの列挙をトリガーしないように注意してください。これにより、遅延クエリが破損し、データベースから100万レコードが返され、アプリケーションサーバーでフィルタリングされる可能性があります。

これが正しい方法かどうかはわかりませんが、試してみましたが、うまくいきました。


6
ビューを使用したい理由の1つは、EFによって生成されたSQLが常に「適切」であるとは限らないことです。モデルにはいくつかの継承階層があり(落とし穴については遅すぎます...)、ビューを使用すると次のことが可能になります。 SQLを手動で作成します。ビューが望ましい理由についての対位法
Carl

2
これを行わない他の理由は、LINQでは使用できない再帰共通テーブル式の使用である可能性があります。しかし、そうでなければ、これはより単純なシナリオのための良いアドバイスです。
トムPažourek2016年

1
インデックス付きビューの利点を利用したい場合は、ビューの代わりにプロパティを使用することはできません。
Rudey 2017

「selectステートメントを使用するだけで制限されることはありません」。これはどういう意味ですか?LINQで実行できることはすべて、SELECTステートメントを使用して実行できますが、その逆については同じことが言えません。
Rudey 2017

3

これは古い質問であり、ここには多くの回答がありますが、この回答を使用すると問題が発生し、パッケージマネージャーコンソールでupdate-databaseコマンドを使用するとエラーが発生しました。

データベースにはすでに「...」という名前のオブジェクトがあります。

そして私はこの問題を解決するためにこれらのステップを使用します:

  1. パッケージマネージャーコンソールでこのコマンドを実行します:Add-migration intial
  2. Migrationsフォルダーの下に、..._ intial.csファイルがあり、それを開いて、マップするクラスに関連するコマンドをコメントまたは削除できます。
  3. これで、通常、モデルへの他の変更にupdate-databaseコマンドを使用できます。

それが役に立てば幸い。


1
ありがとう!これは本当に役に立ちました!追加として、EF Migrationsで生成されたコードを削除する代わりに、そこに追加することができますmigrationBuilder.Sql("CREATE OR REPLACE VIEW ...); 同僚もそれを使用してデータベースをアップグレードできるようにします。
Rich_Rich
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.