0

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 
+0

Die gespeicherte Prozedur muss alle Eigenschaften zurückgeben, die im 'cards'-Modell vorhanden sind – Scrobi

+1

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. –

+0

Danke. Dies löste alle meine Probleme. –

Antwort

0

auf der Grundlage des Fehlers Sie bekommen:

The data reader is incompatible with the specified GiftworxModel.Card. A member of the type, CardID, does not have a corresponding column in the data reader with the same name

Sie haben CardID Eigenschaft in GiftworxModel.Card Klasse, aber sie sind nicht die CardID von der gespeicherten Prozedur zurückkehrt. Versuchen Sie einfach CardID von der gespeicherten Prozedur zu übergeben. Im Grunde genommen sollte die Ergebnismenge Ihrer gespeicherten Prozedur alle in der Klasse GiftworxModel.Card vorhandenen Felder zurückgeben.

0

Sie versuchen, das Ergebnis Ihrer gespeicherten Prozedur einem "Karten" -Objekt zuzuordnen, aber das Mapping schlägt fehl. Ich kann es nicht genau sagen, da ich die Auswahl nicht sehen kann, die von der gespeicherten Prozedur zurückgegeben wird, aber entweder kein "Karten" -Ergebnis zurückgibt oder nicht alle Eigenschaften zurückgibt (zB: CardID im Fehler) .

Verwandte Themen