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')。您能告诉我吗