我正在使用EF5。我用过代码第一种方法。使用存储过程时出错。错误是
"The entity type CustomProduct is not part of the model for the current context."
在Db中有3个表格。
产品
ProuctVaraint
ProductPrice
并且每个实体都有单独的类,具有所有属性。
这是所有课程
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中搜索此表,并且它找不到任何表,这就是它抛出异常的原因。
请有人建议我怎么做。有没有其他方法来处理这种情况?
答案 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中没有对应的。