我有一个存储过程:
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存储过程结果的屏幕
以下是用于调用通用存储库的存储库的代码
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找到了解决方案
但是对我不起作用。
答案 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则不然。这就是错误信息所说的内容。