【问题标题】:Type 'sp' is mapped as a complex type. The Set method, DbSet objects, and DbEntityEntry objects can only be used with entity types, not complex types类型“sp”被映射为复杂类型。 Set 方法、DbSet 对象和 DbEntityEntry 对象只能用于实体类型,不能用于复杂类型
【发布时间】:2017-12-20 14:32:10
【问题描述】:

我有一个存储过程:

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; }
}

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

这是存储库调用通用存储库的代码

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;
        }
}

这是通用代码

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();
        }
}

我收到一个错误

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

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

但这对我不起作用。

【问题讨论】:

  • 我是 猜测 EF 抱怨您正在调用 DbContext.Set&lt;StoreProcReport_Result&gt;,但 DbContext 不包含 StoreProcReport_Result 的 DbSet。将DbSet&lt;StoreProcReport_Result&gt; StoreProcReport { get; set; } 添加到 DbContext。

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


【解决方案1】:

你没有关注你提到的文章。

你的方法

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

应该改写为:

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

拥有Set&lt;T&gt;() 意味着您正在处理在数据库上下文中定义的实体类,但StoredProcedureReport_Result 并非如此。这就是错误消息所说的内容。

【讨论】:

  • 我改变了你提到的但我收到了一个新错误,因为“参数化查询'(@QuotationNo varchar(8000),@AgencyName varchar(8000),@ContractS'需要参数'@ QuotationNo',没有提供。”你能告诉我吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多