簡體   English   中英

使用EF的mvc中的存儲過程(數據庫優先)

[英]Stored procedure in mvc using EF(Database first)

我有一個MVC應用程序,它需要調用數據庫中的存儲過程。 該功能基本上允許用戶選擇一個商店,並輸入他們想要為該商店生成的卡數。 我的代碼的工作方式是插入並生成這些卡,但始終因以下錯誤而中斷:“數據讀取器與指定的'GiftworxModel.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

根據錯誤,您將得到:

數據讀取器與指定的GiftworxModel.Card不兼容。 類型為CardID的成員在數據讀取器中沒有具有相同名稱的對應列

你已經CardID物業GiftworxModel.Card類,但你不必返回CardID從存儲過程。 只需嘗試從存儲過程傳遞CardID。 因此,基本上,您的存儲過程結果集應返回GiftworxModel.Card類中存在的所有字段。

您試圖將存儲過程結果映射到“ Card”對象,但映射失敗。 我無法確定,因為我看不到存儲過程返回的選擇,但是您要么不返回“ Card”結果,要么不返回其所有屬性(例如:錯誤中的CardID) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM