web-dev-qa-db-ja.com

Entity Framework CoreでSQLビューを操作する

たとえば、私はそのようなモデルを持っています:

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogImage BlogImage { get; set; }
}

public class BlogImage
{
    public int BlogImageId { get; set; }
    public byte[] Image { get; set; }
    public string Caption { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
} 

ImageView view rlおよびImageで戻りたい。

そのSQLビューを作成して定義する必要があるのはどこですか?

37
Yurii N.

Entity Framework Core 2.1では、Yuriy Nが示唆したように Query Types を使用できます。

それらの使用方法に関するより詳細な記事は here にあります。

この記事の例によると、最も単純なアプローチは次のとおりです。

1.たとえば、出版物を管理するための次のエンティティモデルがあります

public class Magazine
{
  public int MagazineId { get; set; }
  public string Name { get; set; }
  public string Publisher { get; set; }
  public List<Article> Articles { get; set; }
}

public class Article
{
  public int ArticleId { get; set; }
  public string Title { get; set; }
  public int MagazineId { get; set; }
  public DateTime PublishDate { get;  set; }
  public Author Author { get; set; }
  public int AuthorId { get; set; }
}
public class Author
{
  public int AuthorId { get; set; }
  public string Name { get; set; }
  public List<Article> Articles { get; set; }
}

2.AuthorArticleCountsというビューがあり、著者が書いた記事の名前と数を返すように定義されています

SELECT
  a.AuthorName,
  Count(r.ArticleId) as ArticleCount
from Authors a
  JOIN Articles r on r.AuthorId = a.AuthorId
GROUP BY a.AuthorName

3.ビューに使用するモデルを作成します

public class AuthorArticleCount
{
  public string AuthorName { get; private set; }
  public int ArticleCount { get; private set; }
}

4.その後、DbContextのDbQueryプロパティを作成して、モデル内でビューの結果を使用します

public DbQuery<AuthorArticleCount> AuthorArticleCounts{get;set;}

5.最後に、このようなビューの結果を簡単に取得できます。

var results=_context.AuthorArticleCounts.ToList();
44

ビューは現在、Entity Framework Coreでサポートされていません。 https://github.com/aspnet/EntityFramework/issues/827 を参照してください。

つまり、エンティティをテーブルにマッピングすることにより、EFをだましてビューを使用することができます。このアプローチには制限があります。例えば移行を使用することはできません。EFのキーを手動で指定する必要があり、一部のクエリが正しく機能しない場合があります。この最後の部分を回避するには、手動でSQLクエリを記述できます

context.Images.FromSql("SELECT * FROM dbo.ImageView")
23
natemcmaster

EF CoreでSQLビューを操作する新しい方法を次に示します。 クエリタイプ

13
Yurii N.

EF Coreは、コンテキストcalssでSQLビューのDBsetを自動的に作成しません。以下のように手動で追加できます。

public partial class LocalDBContext : DbContext
{ 

    public LocalDBContext(DbContextOptions<LocalDBContext> options) : base(options)
    {

    }

    public virtual DbSet<YourView> YourView { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<YourView>(entity => {
            entity.HasKey(e => e.ID);
            entity.ToTable("YourView");
            entity.Property(e => e.Name).HasMaxLength(50);
        });
    }

}

サンプルビューは、プロパティがほとんどない以下のように定義されています

using System;
using System.Collections.Generic;

namespace Project.Entities
{
    public partial class YourView
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }
}

ビューのクラスとコンテキストクラスに設定されたDBを追加したら、コントローラーのコンテキストオブジェクトを介してビューオブジェクトを使用するのが適切です。

11

QueryTypesはEF Core 2.1の標準的な回答ですが、データベースからの最初のアプローチから移行するときに使用した別の方法があります(ビューはデータベースに既に作成されています)。

  • ビュー列に一致するようにモデルを定義します(ビュー名にモデルクラス名を一致させるか、Table属性を使用します。[Key]属性が少なくとも1つの列に適用されていることを確認してください。
  • コンテキストにDbSetを追加します
  • 移行の追加(Add-Migration)
  • 提供されたモデルに基づいて作成/削除する「テーブル」の作成/削除のコードを削除またはコメントアウトします
  • データベースの更新(Update-Database)
1
Alexei