使用EF Core加载未映射属性

5
我希望能够通过调用存储过程来使用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();

当查询执行时,被忽略的列不会映射到实体。在调用存储过程时是否有可能将忽略的字段映射到实体,或者我必须为存储过程创建另一个实体或类似的东西?

1个回答

6

当您在列上使用流利API的忽略方法时,它将不会在SQL Server中创建该列(忽略它)。
存储过程的结果将根据您创建的查询为您提供一些列,并且这些列名必须与实体的属性名匹配。
例如,您的过程会给您一个具有以下列和SQL Server中匹配的数据类型以及您的类:

  1. 纬度
  2. 经度
  3. 半径
  4. 距离

那么您应该为您的过程创建一个类:

public class LocationProcedure {
   public string Latitude {get;set;}
   public string Longitude {get;set;}
   public string Radius {get;set;}
   public string Distance {get;set;}
}

同时,在你的dbContext中添加一个这种类型的dbset,并使用[NotMapped]属性:

[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();

你让我感到非常开心!虽然这不是我的最终解决方案,但你让我找对了方向。由于新实体具有复合键,我需要通过流畅的映射声明键,而不将实体绑定到表格,这种映射是有效的。 - Sebastian S.
此外,Ef需要每个DbSet都有一个名为Id或其他主键的列。否则,它会抛出异常。 - Armin Torkashvand
3
在使用带有 [NotMapped] 属性的 DbSet 时,在应用迁移后,仍会创建相应的数据库表。 - Aleksandr Chuikov
3
是的,[NotMapped] 应该修饰 LocationProcedure 类,而不是 DbSet - user3071284
我正在创建一个SQL查询字符串,每种情况下都有动态选择列。因此,我创建了一个带有所有字段的C#模型,并给它们NotMapped属性。但是当我查询时,值没有被赋值给它。 - Ameerudheen.K
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接