C# 使用EF的mvc存储过程(数据库优先)

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

我有一个MVC应用程序,需要调用数据库中的存储过程。该功能基本上允许用户选择一个商店,并输入他们想要为该商店生成的卡片数量。我的代码的工作原理是插入并生成这些卡,但它不断出现以下错误:“数据读取器与指定的'giftoworxmodel.Card'不兼容。类型为'cardd'的成员在数据读取器中没有同名的对应列。”创建卡后,控制器方法也不会重定向到索引

上下文类:

 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");
    }