输入' sp'被映射为复杂类型。 Set方法,DbSet对象和DbEntityEntry对象只能用于实体类型,而不能用于复杂类型

时间:2017-12-20 14:32:10

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

我有一个存储过程:

public partial class StoreProcReport_Result
{
        public string Contract_QuoteNo { get; set; }
        public System.DateTime Contract_StartDate { get; set; }
        public System.DateTime Contract_EndDate { get; set; }
        public string Contract_AgencyName { get; set; }
        public int ContractService_Id { get; set; }
        public string Description { get; set; }
        public Nullable<System.DateTime> OrderStartDate { get; set; }
        public Nullable<System.DateTime> OrderEndDate { get; set; }
        public Nullable<int> OrderTermMonths { get; set; }
        public Nullable<decimal> MonthlyUnitPrice { get; set; }
        public Nullable<decimal> Quantity { get; set; }
        public Nullable<decimal> TotalPrice { get; set; }
        public System.Guid ContractId { get; set; }
}

我正在使用存储库模式来执行实体框架,这里是SQL Server存储过程结果的屏幕

stored procedure result

以下是用于调用通用存储库的存储库的代码

public class ReportService : IReportService
{
        private readonly IGenericRepository<StoreProcReport_Result> _iGenericReportProcRepository;

        public ReportService(IGenericRepository<StoreProcReport_Result> iGenericReportProcRepository)
        {
            _iGenericReportProcRepository = iGenericReportProcRepository;
        }

        public List<DataExtractionViewModel> GetReportResultByFilter(ReportFilterViewModel filter)
        {
            List<DataExtractionViewModel> list = new List<DataExtractionViewModel>();
            var reportFilterDb =
                _iGenericReportProcRepository.ExecuteStoreProcFunction("StoreProcReport @QuotationNo, @AgencyName, @ContractStartDate, @ContractEndDate, @contractTerm",
                    new SqlParameter("QuotationNo", SqlDbType.VarChar) { Value = filter.QuotationNo },
                    new SqlParameter("AgencyName", SqlDbType.VarChar) { Value = filter.AgencyName },
                    new SqlParameter("ContractStartDate", SqlDbType.DateTime) { Value = filter.ContractStartDate },
                    new SqlParameter("ContractEndDate", SqlDbType.DateTime) { Value = filter.ContractEndDate },
                    new SqlParameter("contractTerm", SqlDbType.Int) { Value = filter.Term }
                    ).ToList();

            reportFilterDb.ForEach(item =>
            {
            });

            return list;
        }
}

这是通用代码

public class GenericRepository<T> : IGenericRepository<T> where T : class 
{
        private readonly DATAEXTRACTION_DEVEntities _entities;

        public GenericRepository(DATAEXTRACTION_DEVEntities dbContext)
        {
            _entities = dbContext;
        }

        public virtual IEnumerable<T> ExecuteStoreProcFunction(string query, params object[] parameters)
        {
            return _entities.Set<T>().SqlQuery(query, parameters).ToList();
        }
}

我收到错误

  

键入&#39; sp&#39;被映射为复杂类型。 Set方法,DbSet对象和DbEntityEntry对象只能用于实体类型,而不能用于复杂类型

这是在通用仓库中执行存储过程的最佳方法我从Using Generic Repository and Stored Procedures找到了解决方案

但是对我不起作用。

1 个答案:

答案 0 :(得分:0)

你没有听过你提到的那篇文章。

你的方法

public virtual IEnumerable<T> ExecuteStoreProcFunction(string query, params object[] parameters)
        {
            return _entities.Set<T>().SqlQuery(query, parameters).ToList();
        }

应改写为:

return _entities.Database.SqlQuery<T>(query, parameters).ToList();

拥有Set<T>()意味着您正在处理数据库上下文中定义的实体类,但对于StoreProcReport_Result则不然。这就是错误信息所说的内容。