C# 使用EF的mvc存储过程(数据库优先)
我有一个MVC应用程序,需要调用数据库中的存储过程。该功能基本上允许用户选择一个商店,并输入他们想要为该商店生成的卡片数量。我的代码的工作原理是插入并生成这些卡,但它不断出现以下错误:“数据读取器与指定的'giftoworxmodel.Card'不兼容。类型为'cardd'的成员在数据读取器中没有同名的对应列。”创建卡后,控制器方法也不会重定向到索引 上下文类:C# 使用EF的mvc存储过程(数据库优先),c#,entity-framework,stored-procedures,model-view-controller,C#,Entity Framework,Stored Procedures,Model View Controller,我有一个MVC应用程序,需要调用数据库中的存储过程。该功能基本上允许用户选择一个商店,并输入他们想要为该商店生成的卡片数量。我的代码的工作原理是插入并生成这些卡,但它不断出现以下错误:“数据读取器与指定的'giftoworxmodel.Card'不兼容。类型为'cardd'的成员在数据读取器中没有同名的对应列。”创建卡后,控制器方法也不会重定向到索引 上下文类: public virtual ObjectResult<Card> CreateCards(Nullable<in
public virtual ObjectResult<Card> CreateCards(Nullable<int> numberOfCards, Nullable<int> customerID, MergeOption mergeOption)
{
var numberOfCardsParameter = numberOfCards.HasValue ?
new ObjectParameter("NumberOfCards", numberOfCards) :
new ObjectParameter("NumberOfCards", typeof(int));
var customerIDParameter = customerID.HasValue ?
new ObjectParameter("CustomerID", customerID) :
new ObjectParameter("CustomerID", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Card>("CreateCards", mergeOption, numberOfCardsParameter, customerIDParameter);//This is where the code breaks
}
视图:
@使用(Html.BeginForm(“创建”、“卡片”、FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true,“,new{@class=“text danger”})
@Html.HiddenFor(model=>model.cardd)
商场
@DropDownList(“CustomerID”,null,htmlAttributes:new{@class=“form control”})
@Html.ValidationMessageFor(model=>model.CustomerID,“,new{@class=“text danger”})
卡数:
}
根据您收到的错误:
数据读取器与指定的giftoworxmodel.Card不兼容。类型CardID的成员在数据读取器中没有同名的对应列
您在
GiftworxModel.Card
类中有cardd
属性,但您没有从存储过程返回cardd
。只需尝试从存储过程中传递CardID。因此,基本上,存储过程结果集应该返回GiftworxModel.Card
类中存在的所有字段。您试图将存储过程结果映射到“Card”对象,但映射失败。我不能确定,因为我看不到存储过程返回的select,但您要么不返回“Card”结果,要么不返回它的所有属性(例如:错误中的cardd).存储过程将需要返回卡
模型中的所有属性尝试将SELECT语句更改为:选择Customers.CustomerCompanyName、cards.CardID、cards.CardNumber FROM Customers内部联接卡…
。当然,此错误来自ExecuteFunction
查询结果映射中不存在的列。谢谢。这解决了我所有的问题。
public ActionResult Create()
{
ViewBag.CustomerID = new SelectList(db.Customers, "CustomerID", "CustomerCompanyName");
return View();
}
// POST: Cards/Create
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Card card, int? numberOfCards, int?customerId)
{
var cards = db.CreateCards(numberOfCards, customerId).ToList();
ViewBag.CustomerID = new SelectList(db.Customers, "CustomerID", "CustomerCompanyName", card.CustomerID);
return RedirectToAction("Index", "Cards");
}