EF:实体类型不是使用存储过程的当前上下文的模型的一部分

时间:2013-11-26 05:55:34

标签: c# entity-framework ef-code-first code-first

我正在使用EF5。我用过代码第一种方法。使用存储过程时出错。错误是

"The entity type CustomProduct is not part of the model for the current context."

在Db中有3个表格。

  • 产品

    • 产品编号
    • 产品名称
    • ProductDesription
  • ProuctVaraint

    • ProductVaraintId
    • 产品编号
    • ProductVaraintName
    • 库存
    • 尺寸
  • ProductPrice

    • ProductPriceId
    • ProudctId
    • 价格

并且每个实体都有单独的类,具有所有属性。

  • Product.cs
  • ProductVaraint.cs
  • ProductPrice.cs

这是所有课程

public class Product
    {
        public int ProductId { get; set; }

        public string ProductName { get; set; }

        public string ProductDescription { get; set; }

    }

    public class ProductVaraint
    {
        public int ProductVaraintId { get; set; }

        public int ProductId { get; set; }

        public string ProdcutVaraintName { get; set; }

        public int Stock { get; set; }

        public int Size { get; set; }
    }

    public class ProductPrice
    {
        public int ProductPriceId { get; set; }

        public int ProductId { get; set; }

        public decimal Price { get; set; }
    }

    public class CustomProduct
    {
        public int ProudctId { get; set; }

        public string ProductName { get; set; }

        public string ProductDescription { get; set; }

        public int Stock { get; set; }

        public int Size { get; set; }

        public decimal Price { get; set; }
    }

这是存储过程

   public IList<CustomProduct> ExecuteSP()
    {
        var context = ((IObjectContextAdapter)(this)).ObjectContext;
        var connection = this.Database.Connection;

            //open the connection
            if (connection.State == ConnectionState.Closed)
                connection.Open();
            //create a command object
            using (var cmd = connection.CreateCommand())
            {
                //command to execute
                cmd.CommandText = "GetProducts";
                cmd.CommandType = CommandType.StoredProcedure;

                var reader = cmd.ExecuteReader();

                var result = context.Translate<CustomProduct>(reader).ToList();
                for (int i = 0; i < result.Count; i++)
                    result[i] = AttachEntityToContext(result[i]);
                reader.Close();
                return result;
            }

        }
    }



public TEntity AttachEntityToContext<TEntity>(TEntity entity) where TEntity : BaseEntity, new()
        {

var alreadyAttached = Set<TEntity>().Local.Where(x => x.Id == entity.Id).FirstOrDefault();
            if (alreadyAttached == null)
            {
                Set<TEntity>().Attach(entity);
                return entity;
            }
            else
            {
                return alreadyAttached;
            }
        }

我已将Product.cs,ProductVaraint.cs和ProductPrice.cs与DBContext映射但未映射CustomProduct.cs

现在,我已经创建了一个存储过程来返回ProductName(来自Product),ProductDescription(来自产品),Stock(来自ProductVaraint),Size(来自ProductVaraint)和Price(来自ProductPrice)。

为了映射这个属性,我有一个名为CustomProudct.cs的独立类,它包含存储过程返回的所有属性,并使用存储过程映射此类。

CustomProduct没有单独的表,我不需要为映射sp结果创建额外的表。

我知道没有单独的CustomProduct表和EF的原因是尝试在Db中搜索此表,并且它找不到任何表,这就是它抛出异常的原因。

请有人建议我怎么做。有没有其他方法来处理这种情况?

1 个答案:

答案 0 :(得分:1)

你应该有像

这样的东西
List<CustomProduct> lst = new List<CustomProduct>();
 while reader.Read()
          {
             CustomProduct cp = new CustomProduct();
             cp.ProductName = reader.GetString(0); --where 0 is the column index
             .....
             lst.Add(cp);
          }

我不知道AttachEntityToContext的作用,但顾名思义,您正在尝试将此CustomProduct附加到DbContext。它不起作用,因为这是你创建的一个类,在DB中没有对应的。