【问题标题】:Stored procedure in mvc using EF(Database first)使用EF(数据库优先)在mvc中的存储过程
【发布时间】: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


【解决方案1】:

您正在尝试将存储过程结果映射到“卡片”对象,但映射失败。我无法确定,因为我看不到存储过程返回的选择,但您要么没有返回“卡”结果,要么没有返回它的所有属性(例如:错误中的 CardID) .

【讨论】:

    【解决方案2】:

    根据您收到的错误:

    数据读取器与指定的 GiftworxModel.Card 不兼容。类型的成员 CardID 在数据读取器中没有同名的对应列

    您在GiftworxModel.Card 类中有CardID 属性,但您没有从存储过程中返回CardID。只需尝试从存储过程中传递 CardID。所以基本上你的存储过程结果集应该返回GiftworxModel.Card类中存在的所有字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多