【问题标题】:Entity Framework stored column mapping issue with DTODTO 的实体框架存储列映射问题
【发布时间】:2019-09-16 17:22:26
【问题描述】:

我正在使用存储过程从数据库中检索列,并通过 EF 代码优先方法将值绑定到我的 DTO 类中。

我在获取 ReferenceNumberBookingNumber 属性的值时遇到问题。我得到这些属性的空值。

通过EF代码优先方式执行存储过程:

SqlParameter param1 = new SqlParameter("@Id", 1); 
var stocks = await context.Database.SqlQuery<Stock>("dbo.[GetStocks @Id", param1).ToListAsync();

获取库存清单的存储过程:

CREATE PROCEDURE [dbo].[GetStocks]  
    (@id INTEGER)  
AS    
BEGIN  
    SELECT ID, name, RefNo, BookingNo 
    FROM dbo.Stock
END

DTO 类获取值

namespace ConsoleApp6
{
    using System;

    public partial class Stock
    {
       public int ID { get; set; }
       public string name { get; set; }
       public string ReferenceNumber { get; set; }
       public string BookingNumber { get; set; }
    }
}

{ “身份证”:“1”, "名称":"ABC", “参考编号”:””, “订单号”:”” }

我们是否可以选择获取这些值?

【问题讨论】:

  • 你少了一个“]”。
  • 您的选择语句未返回任何名称为 ReferenceNumber 或 BookingNumber 的列。对象中的属性名称必须与数据读取器中的属性名称匹配才能正常工作。您可以重命名数据库列以匹配模型上的确切属性名称,或者重命名模型上的属性名称以匹配数据库列名称
  • 真正的问题是什么?为什么值为空会有问题?
  • @codein 是正确的。
  • @codein 我们是否可以选择使用任何属性在 C# DTO 类中显式提及 db 列名?

标签: c# .net sql-server linq entity-framework-6


【解决方案1】:

您的选择语句不返回任何名称为 ReferenceNumber 或 BookingNumber 的列。对象中的属性名称必须与数据读取器中的属性名称匹配才能正常工作。您可以重命名数据库列以匹配模型上的确切属性名称,也可以重命名模型上的属性名称以匹配数据库列名称。

或者,您可以如下重写您的 SP:

 CREATE PROCEDURE [dbo].[GetStocks]  
(  
  (@id INTEGER
  )  
  AS    
 BEGIN  
  SELECT ID, name, RefNo as 'ReferenceNumber ', BookingNo as 'BookingNumber ' from
  FROM dbo.Stock where id =@id
 END

由于您是根据 id 参数从 db 中检索单个实体,因此无需调用 ToList 扩展方法。使用 .SingleOrDefaultAsync()

【讨论】:

  • 我们是否可以选择使用任何属性在 C# DTO 类中显式提及 db 列名?
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2011-05-29
相关资源
最近更新 更多