ストアドプロシージャを呼び出すことによって、EF Coreでエンティティをロードしようとしました。エンティティは、ストアドプロシージャによって選択されたすべての列を含まない流暢なマッピングによってテーブルにマップされます。
テーブルの列として存在しない選択されたフィールドは、次のようなエンティティ構成では無視されます。
modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Latitude);
modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Longitude);
modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Radius);
modelBuilder.Entity<CustomerLocationEntity>().Ignore(c => c.Distance);
ストアドプロシージャは次のように呼び出されます。
await SalesContext.CustomerLocation
.FromSql("GetCustomersByLocation @latitude={0}, @longitude={1}, @radius={2}", lat,
lon, radius)
.ToListAsync();
クエリが実行されると、無視された列はエンティティにマップされません。ストアドプロシージャを呼び出すときに、無視されたフィールドをエンティティにマップする可能性はありますか?またはストアドプロシージャのようなものを作成する必要がありますか?
Fluent APIのignoreメソッドを列に使用すると、SQL Serverではその列が作成されません(無視されます)。
ストアドプロシージャの結果は、作成されたクエリに基づいていくつかの列が表示され、これらの列名はエンティティのプロパティ名と一致する必要があります。
たとえば、プロシージャでは、SQL Serverとクラスのこれらの列と一致するデータ型の表が提供されます。
次に、プロシージャ用のクラスを作成する必要があります。
public class LocationProcedure {
public string Latitude {get;set;}
public string Longitude {get;set;}
public string Radius {get;set;}
public string Distance {get;set;}
}
[NotMapped]
属性を使用してこのタイプのdbsetをdbContextに追加します。
[NotMapped]
public DbSet<LocationProcedure> CustomerLocation {get; set:}
この属性は、これがデータベース内のテーブルであってはならないことを示します。
最後に、新しいdbset CustomerLocation
プロシージャを使用して、結果をLocationProcedureクラスにマップします。
await SalesContext.CustomerLocation
.FromSql("GetCustomersByLocation @latitude={0}, @longitude={1}, @radius={2}", lat,
lon, radius)
.ToListAsync();