Seb*_* S. 5 c# entity-framework entity-framework-core
我尝试通过调用存储过程来使用 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);
Run Code Online (Sandbox Code Playgroud)
存储过程的调用方式如下:
await SalesContext.CustomerLocation
.FromSql("GetCustomersByLocation @latitude={0}, @longitude={1}, @radius={2}", lat,
lon, radius)
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
执行查询时,忽略的列不会映射到实体。调用存储过程时是否有可能将忽略的字段映射到实体,或者我是否必须为存储过程创建另一个实体或类似的东西?
当您在列上使用 Fluent api 的忽略方法时,它不会在 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;}
}
Run Code Online (Sandbox Code Playgroud)
并使用[NotMapped]属性将这种类型的 dbset 添加到 dbContext 中:
[NotMapped]
public DbSet<LocationProcedure> CustomerLocation {get; set:}
Run Code Online (Sandbox Code Playgroud)
该属性表明这不应该是数据库中的表。
最后,您可以将您的过程与新的 dbset 一起使用CustomerLocation,然后它将结果映射到LocationProcedure类。
await SalesContext.CustomerLocation
.FromSql("GetCustomersByLocation @latitude={0}, @longitude={1}, @radius={2}", lat,
lon, radius)
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16567 次 |
| 最近记录: |