【问题标题】:Entity Framework stored procedure returns null object实体框架存储过程返回空对象
【发布时间】:2016-02-16 00:32:15
【问题描述】:

我有一个 ASP.NET MVC 站点,我想显示存储过程的一些详细信息。我之前在同一个应用程序的不同页面上对其他存储过程做过完全相同的事情并且它已经工作了,但是这个存储过程调用返回一个空对象而不是预期值。

EF 调用存储过程:

public MostRecentOrderDetail GetMostRecentOrder(int userId)
{
    var context = new myDatabaseContext();
    var paramUserId = new SqlParameter { ParameterName = "viUserId", Value = userId };
    var result = context.Database.SqlQuery<MostRecentOrderDetail>("usp#GetMostRecentOrder @viUserId", paramUserId).FirstOrDefault();
    return result;
}

在我的控制器中,我使用以下方法调用它:

MostRecentOrderDetail latestOrder = myDB.GetMostRecentOrder(CurrentUser.UserId).FirstOrDefault();

当我在 SQL Server Management Studio 中调用存储过程时,它返回一个填充了正确值的单行表,我似乎无法让我的 ASP.NET MVC 站点看到它。

MVC 站点使用代码优先,MostRecentOrderDetail 对象正确映射到存储过程的列。

*编辑

我已按照下面的@DanielDrews 建议更新了我的代码,现在收到一个异常,我认为这是向前迈出的一步:

The data reader is incompatible with the specified 'MyApp.Models.MostRecentOrderDetail'. A member of the type, 'OrderTypeCode', does not have a corresponding column in the data reader with the same name. 

我相信我的模型映射正确。

myDatabaseContext.cs

public partial class myDatabaseContext : DbContext
{
    // Database Initializer etc

    public IDbSet<MostRecentOrderDetail> MostRecentOrderDetails { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // ... Other Maps
        modelBuilder.Configurations.Add(new MostRecentOrderMap());
    }
    // GetMostRecentOrder() function from above
}

MostRecentOrderMap.cs

 public class MostRecentOrderMap : EntityTypeConfiguration<MostRecentOrderDetail>
    {
        public MostRecentOrderMap()
            {    
                // Table and Column Mappings
                this.ToTable("usp#GetMostRecentOrder");

                this.Property(t => t.OrderTypeCode).HasColumnName("order_type_code");
                this.Property(t => t.OrderStatusCode).HasColumnName("order_status_code");
                this.Property(t => t.OrderReceivedDate).HasColumnName("order_received_date");
                this.Property(t => t.OrderShippedDate).HasColumnName("order_shipped_date");    
            }

    }

MostRecentOrderDetail.cs

public class MostRecentOrderDetail
{
    [Key]
    public string OrderTypeCode { get; set; }
    public string OrderStatusCode { get; set; }
    public DateTime OrderReceivedDate { get; set; }
    public DateTime OrderShippedDate { get; set; }
}

存储过程本身:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp#GetMostRecentOrder]
         @viUserId int
AS
begin
SELECT TOP 1    o.order_type_code, 
        o.order_status_code,
        o.order_received_date, 
        o.order_shipped_date 
FROM    ORDER_TABLE o 
WHERE   o.user_id = @viUserId
end

【问题讨论】:

  • UserId 肯定被正确传递了?
  • @Papa 是的,据我所知它正在通过它,return 行上的断点显示UserID 具有Base: @viUserId , DBType: Int32, Value: 1234(我的测试用户ID)。我似乎无法检查正在执行的实际查询。

标签: c# asp.net-mvc entity-framework stored-procedures


【解决方案1】:

这可能是参数viUserId的问题(值是否正确?),尝试像这样初始化:

var paramUserId = new SqlParameter { ParameterName = "viUserId", Value = userId };

在我的应用程序中,我调用的过程有点不同。翻译成你的问题应该是这样的:

var paramUserId = new SqlParameter { ParameterName = "viUserId", Value = userId };
var result = this.DbContext.Database.SqlQuery<MostRecentOrderDetail>("usp#GetMostRecentOrder @viUserId", paramUserId).FirstOrDefault();

最后一件事。确保它们具有相同的类型(映射和数据库)。这可能会导致异常

*编辑

该过程需要返回模型中的所有属性(同名)。过程返回“order_type_code”,但模型需要 OrderTypeCode。

【讨论】:

  • 谢谢,我已经更新了我的代码以使用你的建议,我现在确实遇到了一个异常,但不是因为 viUserId 参数,我已经更新了更详细的原始问题。跨度>
  • Jake,该程序需要返回模型中的所有属性(同名)。过程返回“order_type_code”,但需要 OrderTypeCode。 “[...]在数据读取器中没有同名的对应列。”
  • 就是这样!即使使用映射文件,我也需要更改模型属性名称以完全匹配数据库列名称。谢谢。
【解决方案2】:

您的参数代码中有错字。你在"viUserId"中缺少的@

UserID = new SqlParameter("@viUserId", userId);

【讨论】:

  • 我更新了代码以包含@,但它仍然返回一个空对象。
猜你喜欢
  • 2012-05-07
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多