Ich habe eine MVC-Anwendung, die einen Aufruf an eine gespeicherte Prozedur in der Datenbank erfordert. Die Funktion ermöglicht es dem Benutzer grundsätzlich, ein Geschäft auszuwählen und die Anzahl der Karten einzugeben, die für dieses Geschäft generiert werden sollen. Mein Code funktioniert, indem er diese Karten einfügt und generiert, ABER er bricht immer mit diesem Fehler: "Der Datenleser ist nicht kompatibel mit der angegebenen 'GiftworxModel.Card'. Ein Mitglied des Typs 'CardID' hat keine entsprechende Spalte im Datenleser mit dem gleichen Namen. " Die Controller-Methode leitet auch nicht zum Index um, nachdem die Karte erstellt wurde.Gespeicherte Prozedur in mvc mit EF (erste Datenbank)
Kontextklasse:
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
}
Controller-Methode:
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");
}
Ausblick:
@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;" />
}
S Verfahren wacht:
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
Die gespeicherte Prozedur muss alle Eigenschaften zurückgeben, die im 'cards'-Modell vorhanden sind – Scrobi
Versuchen Sie, die SELECT-Anweisung zu ändern:' SELECT Customers.CustomerCompanyName, Cards.CardID, Cards.CardNumber FROM Customers INNER JOIN Cards .. .'. Natürlich kommt dieser Fehler von einer nicht vorhandenen Spalte in der 'ExecuteFunction'-Abfrageergebniszuordnung. –
Danke. Dies löste alle meine Probleme. –