Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类型';sp&x27;映射为复杂类型。Set方法、DbSet对象和DbEntityEntry对象只能用于实体类型,不能用于复杂类型_C#_Asp.net_Asp.net Mvc_Entity Framework_Generics - Fatal编程技术网

C# 类型';sp&x27;映射为复杂类型。Set方法、DbSet对象和DbEntityEntry对象只能用于实体类型,不能用于复杂类型

C# 类型';sp&x27;映射为复杂类型。Set方法、DbSet对象和DbEntityEntry对象只能用于实体类型,不能用于复杂类型,c#,asp.net,asp.net-mvc,entity-framework,generics,C#,Asp.net,Asp.net Mvc,Entity Framework,Generics,我有一个存储过程,如下所示: public partial class StoredProcedureReport_Result { public string Contract_QuoteNo { get; set; } public System.DateTime Contract_StartDate { get; set; } public System.DateTime Contract_EndDate { get; set; }

我有一个存储过程,如下所示:

public partial class StoredProcedureReport_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; }
}
public分部类存储过程报告结果
{
公共字符串协定{get;set;}
public System.DateTime合同\u StartDate{get;set;}
public System.DateTime合同\u EndDate{get;set;}
公共字符串协定\u代理名称{get;set;}
public int ContractService_Id{get;set;}
公共字符串说明{get;set;}
公共可为空的OrderStartDate{get;set;}
公共可为空的OrderEndDate{get;set;}
公共可为空的OrderTermMonths{get;set;}
公共可为空的MonthlyUnitPrice{get;set;}
公共可空数量{get;set;}
公共可空TotalPrice{get;set;}
public System.Guid压缩{get;set;}
}
我使用repository模式来执行实体框架,下面是SQL Server存储过程结果的屏幕

下面是存储库调用通用repo的代码

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

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

        public List<DataExtractionViewModel> GetReportResultByFilter(ReportFilterViewModel filter)
        {
            List<DataExtractionViewModel> list = new List<DataExtractionViewModel>();
            var reportFilterDb =
                _iGenericReportProcRepository.ExecuteStoredProcedureFunction("StoredProcedureReport @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;
        }
}
公共类报告服务:IReportService
{
私人只读IGenericRepository _IGenericRepository;
公共报告服务(IGenericRepository IGenericreportprocepository)
{
_igenericreportproclepository=igenericreportproclepository;
}
公共列表GetReportResultByFilter(ReportFilterServiceModel筛选器)
{
列表=新列表();
var reportFilterDb=
_iGenericReportProcRepository.ExecuteStoreProcedureReport(“StoredProcedureReport@QuotationNo、@AgencyName、@ContractStartDate、@ContractEndDate、@contractTerm”,
新的SqlParameter(“QuotationNo”,SqlDbType.VarChar){Value=filter.QuotationNo},
新的SqlParameter(“AgencyName”,SqlDbType.VarChar){Value=filter.AgencyName},
新的SqlParameter(“ContractStartDate”,SqlDbType.DateTime){Value=filter.ContractStartDate},
新的SqlParameter(“ContractEndDate”,SqlDbType.DateTime){Value=filter.ContractEndDate},
新的SqlParameter(“contractTerm”,SqlDbType.Int){Value=filter.Term}
).ToList();
reportFilterDb.ForEach(项目=>
{
});
退货清单;
}
}
下面是通用代码

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> ExecuteStoredProcedureFunction(string query, params object[] parameters)
        {
            return _entities.Set<T>().SqlQuery(query, parameters).ToList();
        }
}
公共类GenericRepository:IGenericRepository其中T:class
{
私有只读数据提取实体;
公共通用存储库(DATAEXTRACTION\u DEVEntities dbContext)
{
_实体=数据库上下文;
}
公共虚拟IEnumerable ExecuteStoreProcedureFunction(字符串查询,参数对象[]参数)
{
返回_entities.Set().SqlQuery(查询,参数).ToList();
}
}
我犯了一个错误

类型“sp”映射为复杂类型。Set方法、DbSet对象和DbEntityEntry对象只能用于实体类型,不能用于复杂类型

这是在通用repo中执行存储过程的最佳方法吗?我从中找到了解决方案


但是它对我不起作用。

你没有关注你提到的那篇文章

你的方法

public virtual IEnumerable<T> ExecuteStoredProcedureFunction(string query, params object[] parameters)
{
    return _entities.Set<T>().SqlQuery(query, parameters).ToList();
}
公共虚拟IEnumerable ExecuteStoreProcedureFunction(字符串查询,参数对象[]参数)
{
返回_entities.Set().SqlQuery(查询,参数).ToList();
}
应改写为:

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

拥有
Set()
意味着您正在处理在数据库上下文中定义的实体类,但对于
StoredProcedureReport\u结果
则不是这样。这就是错误消息所说的。

我猜EF抱怨您正在调用
DbContext.Set
,但是DbContext不包含storeprocleport\u结果的
DbSet
。将
DbSet-storeprocleport{get;set;}
添加到DbContext。我如您所述进行了更改,但我收到了一个新错误,即“参数化查询”(@QuotationNo-varchar(8000),@AgencyName-varchar(8000),@ContractS'需要未提供的参数'@QuotationNo')。您能告诉我吗