.NET Code First Entity Framework でビューを使用するその他の方法
.NET Code First Entity Framework でビューを使用する方法
Entity Framework (EF) は、.NET Framework と .NET Core 向けの Object-Relational Mapper (ORM) です。 コードファーストアプローチを使用すると、最初にモデルクラスを作成し、EFが対応するデータベーススキーマを自動的に生成します。 ビューは、データベース内のデータを特定の方法で表現する仮想テーブルです。
このチュートリアルでは、.NET Code First Entity Framework でビューを使用する方法について説明します。
要件
このチュートリアルを完了するには、次のものが必要です。
- Visual Studio 2019以降
- .NET Framework 4.6.1 以降 または .NET Core 2.1 以降
- Entity Framework 6.4.0 以降
手順
- プロジェクトを作成する
Visual Studio で新しいコンソールアプリケーションプロジェクトを作成します。
- Entity Framework をインストールする
NuGet パッケージマネージャーを使用して、Entity Framework パッケージをプロジェクトにインストールします。
- モデルクラスを作成する
次のコードを使用して、Product
モデルクラスを作成します。
public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
public int UnitsInStock { get; set; }
}
- DbContext クラスを作成する
次のコードを使用して、MyContext
DbContext クラスを作成します。
public class MyContext : DbContext
{
public MyContext() : base("MyContext")
{
}
public DbSet<Product> Products { get; set; }
}
- ビューを作成する
次の SQL コードを使用して、ProductView
ビューを作成します。
CREATE VIEW ProductView
AS
SELECT
ProductID,
ProductName,
UnitPrice,
UnitsInStock,
(UnitPrice * UnitsInStock) AS TotalValue
FROM Products;
- ビューにマッピングする
次のコードを使用して、ProductView
ビューを Product
モデルクラスにマッピングします。
public class MyContext : DbContext
{
public MyContext() : base("MyContext")
{
}
public DbSet<Product> Products { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.ToTable("ProductView")
.HasNoKey();
}
}
- ビューからデータクエリする
次のコードを使用して、ProductView
ビューからデータを取得します。
using (var context = new MyContext())
{
var products = context.Products.ToList();
foreach (var product in products)
{
Console.WriteLine($"{product.ProductID} - {product.ProductName} - {product.UnitPrice} - {product.UnitsInStock} - {product.TotalValue}");
}
}
説明
この例では、ProductView
ビューを Product
モデルクラスにマッピングします。 これにより、EF はビューをテーブルとして扱います。 HasNoKey()
メソッドを使用して、ビューに主キーがないことを EF に伝えます。
- ビューは読み取り専用です。 EF を使用してビューを更新したり削除したりすることはできません。
- ビューは複雑なクエリを含めることができます。
- 複数のビューを結合して、より複雑なデータをクエリすることができます。
public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public decimal UnitPrice { get; set; }
public int UnitsInStock { get; set; }
}
public class MyContext : DbContext
{
public MyContext() : base("MyContext")
{
}
public DbSet<Product> Products { get; set; }
}
CREATE VIEW ProductView
AS
SELECT
ProductID,
ProductName,
UnitPrice,
UnitsInStock,
(UnitPrice * UnitsInStock) AS TotalValue
FROM Products;
public class MyContext : DbContext
{
public MyContext() : base("MyContext")
{
}
public DbSet<Product> Products { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.ToTable("ProductView")
.HasNoKey();
}
}
using (var context = new MyContext())
{
var products = context.Products.ToList();
foreach (var product in products)
{
Console.WriteLine($"{product.ProductID} - {product.ProductName} - {product.UnitPrice} - {product.UnitsInStock} - {product.TotalValue}");
}
}
using (var context = new MyContext())
{
var products = context.Database.SqlQuery<Product>("SELECT * FROM ProductView").ToList();
foreach (var product in products)
{
Console.WriteLine($"{product.ProductID} - {product.ProductName} - {product.UnitPrice} - {product.UnitsInStock} - {product.TotalValue}");
}
}
SQL クエリを使用してビューをマッピングする
public class MyContext : DbContext
{
public MyContext() : base("MyContext")
{
}
public DbSet<Product> Products { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.HasNoKey()
.ToView("ProductView", null,
s => s.HasColumn("ProductID"),
s => s.HasColumn("ProductName"),
s => s.HasColumn("UnitPrice"),
s => s.HasColumn("UnitsInStock"),
s => s.HasColumn("TotalValue"));
}
}
ビューをプロシージャに変換する
ビューをプロシージャに変換すると、EF を使用してプロシージャを呼び出すことができます。
ビューをマテリアライズドビューに変換する
マテリアライズドビューは、データベースに物理的に格納されたテーブルです。 これにより、ビューのパフォーマンスが向上する可能性があります。
ビューをトリガーに変換する
トリガーを使用して、ビュー内のデータが変更されたときにアクションを実行できます。
どの方法を選択する必要がありますか?
どの方法を選択するかは、要件によって異なります。
- 単純なクエリを実行する場合は、ビューから直接クエリするのが最も簡単です。
- ビューをモデルクラスにマッピングする場合は、SQL クエリを使用してビューをマッピングする方法を使用するのが最良です。
- ビューのパフォーマンスを向上させる必要がある場合は、ビューをマテリアライズドビューに変換することを検討してください。
- ビュー内のデータが変更されたときにアクションを実行する必要がある場合は、ビューをトリガーに変換することを検討してください。
.net database entity-framework