最初にエンティティフレームワークコードでデータベースビューを使用するにはどうすればよいですか?
最初にエンティティフレームワークコードでデータベースビューを使用するにはどうすればよいですか?
回答:
私のように、他のデータベース(私の場合はerp)からのエンティティをマッピングして、それらをアプリケーション固有のエンティティに関連付けることにのみ関心がある場合は、テーブルを使用するときにビューを使用できます(ビューをマッピングする同じ方法!)。明らかに、そのエンティティを更新しようとすると、ビューが更新可能でない場合に例外が発生します。手順は、通常の(テーブルに基づく)エンティティの場合と同じです。
FooViewConfigurationファイルを使用して、ビューに別の名前を設定するか(コンストラクターでToTable( "Foo");を使用)、または特定のプロパティを設定します
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
FooViewConfigurationファイルをmodelBuilderに追加します。たとえば、ContextのOnModelCreatingメソッドを確認します。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
これは、作成を使用するよりも間違いなく簡単ですEntityTypeConfiguration
。
これは更新かもしれませんが、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; }
}
}
正規化されていないオブジェクトの束だけが必要な場合はIQueryable<TDenormolized>
、DbContext
クラスにパブリックget-onlyプロパティを作成しただけかもしれません。
でget
、Linqの結果を返し、非正規化された値を非正規化されたオブジェクトに投影します。これは、プログラミングを行っているため、DBビューを作成するよりも優れている場合がありますselect
。ステートメントの使用だけに制限されるわけではありません。また、コンパイル時のタイプセーフです。
ToList()
呼び出しなどの列挙をトリガーしないように注意してください。これにより、遅延クエリが破損し、データベースから100万レコードが返され、アプリケーションサーバーでフィルタリングされる可能性があります。
これが正しい方法かどうかはわかりませんが、試してみましたが、うまくいきました。
これは古い質問であり、ここには多くの回答がありますが、この回答を使用すると問題が発生し、パッケージマネージャーコンソールでupdate-databaseコマンドを使用するとエラーが発生しました。
データベースにはすでに「...」という名前のオブジェクトがあります。
そして私はこの問題を解決するためにこれらのステップを使用します:
それが役に立てば幸い。
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); 同僚もそれを使用してデータベースをアップグレードできるようにします。