【发布时间】:2017-12-27 05:08:20
【问题描述】:
我有一个 MVC 应用程序,它需要调用数据库中的存储过程。该功能基本上允许用户选择一家商店并输入他们想要为该商店生成的卡片数量。我的代码的工作原理是它插入并生成这些卡片,但它不断出现此错误:“数据读取器与指定的'GiftorxModel.Card'不兼容。类型的成员'CardID'没有相应的列在同名的数据阅读器中。”创建卡片后,控制器方法也不会重定向到索引。
上下文类:
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
}
控制器方法:
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");
}
查看:
@using (Html.BeginForm("Create", "Cards", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="panel-body">
<div class="row">
<div class="col-lg-12">
<form role="form">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.CardID)
<div class="form-group">
<label>Store</label>
@Html.DropDownList("CustomerID", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.CustomerID, "", new { @class = "text-danger" })
</div>
<div class="form-group">
Number of Cards: <input type="text" name="numberOfCards"/>
</div>
<input type="submit" value="Create" class="btn btn-default" style="background-color: #0a9dbd; color: white;" />
}
存储过程:
DECLARE @NumberOfRows as integer = 0;
DECLARE @LoopNumber as integer = 0
WHILE @LoopNumber < @NumberOfCards
Begin
INSERT INTO Cards
(
CustomerID,
CardDate
)
VALUES
(
@CustomerID,
GetDate()
)
SET @LoopNumber = @LoopNumber + 1
END
SELECT Customers.CustomerCompanyName, Cards.CardNumber
FROM Customers INNER JOIN
Cards ON Customers.CustomerID = Cards.CustomerID
WHERE Customers.CustomerID = @CustomerID
ORDER BY CardID ASC
OFFSET @NumberOfRows ROWS
FETCH NEXT @NumberOfCards ROWS ONLY
END
【问题讨论】:
-
存储过程需要返回
cards模型中的所有属性 -
尝试将 SELECT 语句更改为:
SELECT Customers.CustomerCompanyName, Cards.CardID, Cards.CardNumber FROM Customers INNER JOIN Cards ...。当然这个错误来自ExecuteFunction查询结果映射中不存在的列。 -
谢谢。这解决了我所有的问题。
标签: c# entity-framework stored-procedures model-view-controller