EF Core FromSql用于同一模型,但具有不同的查询和额外的列

时间:2019-08-16 07:13:10

标签: asp.net-core .net-core entity-framework-core

假设我有C#类Operation

public class Operation 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
}

使用EF Core FromSql,我想将其用于多个查询。一切都好,然后我写选择自己。但是我面临的问题是,有些存储过程无法更改。而且这些存储过程不会返回我的课程所需的所有列。

例如SP_1返回IdNameCodeSP_2返回IdNameDescription

有什么方法可以将这些属性设置为某些默认值或虚拟值?或者只是忽略这些可选属性,而是从数据库返回它们时映射到类?

4 个答案:

答案 0 :(得分:3)

您可以将数据映射到DTO(数据传输对象)。

可以根据您的需求定制此DTO

您可以将要从实体输出的任何字段映射到特殊DTO

此映射可以手动完成,也可以由自动映射器完成

答案 1 :(得分:0)

对于不是表模型的查询,不同的对象将是更好的解决方案。

  

这些是DTO模型

class obj1
{
Id
Name
Code
}

class obj2
{
Id
Name
Description
}

程序的内容必然会改变。

答案 2 :(得分:0)

据我所知,这是EF / EF Core的缺点。 FromSql不仅需要通用,而且还要求您从查询中获得的响应是​​1对1(数据库中的模型/表),以便可以正确地映射它。

对于类似的东西,您可以使用ADO.NET(甚至可以是Dapper,但我以前从未使用过)。

编辑:您可以使用EF / EF Core来做到这一点,但这将是丑陋的。您需要为每个要通过FromSql方法获取的响应创建新模型,并将该模型用于数据库中的新表。但是不要那样。

答案 3 :(得分:0)

虽然还不是EF Core的答案,但我对使用Dapper(https://www.nuget.org/packages/Dapper)进行的这种事情感到非常高兴。

这确实意味着要回到使用System.Data.SqlClient或Microsoft.Data.SqlClient,但是它允许您运行自定义SQL查询并将结果映射回对象。所以在您的示例中

using Dapper;

using (var connection = new SqlConnection("")){
    connection.Open();

    IEnumerable<Operation> operations = connection.Query<Operation>("exec sp_1",
            commandType: CommandType.StoredProcedure);

}