2012-03-28 12 views

Antwort

0

Ein Problem, das Sie haben, ist, dass Ihre SSDL automatisch vom 'EntityModelGenerator' generiert wird, so dass die Bearbeitung durch eine Neuerstellung gelöscht wird. Ihre Änderungen müssen in der EDMX-Datei vorgenommen werden.

Zuerst müssen Sie entscheiden, ist (1) Ihr Rückgabewert eine Berechnung der Arten (dh Hinzufügen von Werten zusammen in der Anwendung, anstatt auf Datenbankebene), oder (2) ist es ein direkter Aufruf an eine Datenbank gespeicherte Prozedur?

(1) Erster Schritt ist die Funktion XML-Definition in der EDMX-Datei hinzuzufügen:

<Function Name="LineTotal" ReturnType="decimal"> 
    <Parameter Name="lineTotal" Type="MyDbModel.OrderDetail"> 
    <DefiningExpression> 
     od.Price * od.Quantity 
    </DefiningExpression> 
    </Parameter> 
</Function> 

Jetzt, obwohl Ihre EDMX über diese Funktion kennen, Ihre IntelliSense nicht. Sie müssen also Code hinzufügen, damit dies funktioniert. Es ist eine bewährte Methode, diese Funktionen in einer separaten Klasse zu platzieren.

Entity Framework wird diesen Funktionsaufruf stattdessen an den EDMX umleiten. Jeder direkte Aufruf dieser Methode, bei dem das Modell nicht existiert, löst eine Ausnahme aus.

Sie können es dann rufen Sie in Ihrer LINQ-Abfragen wie

var productValues = from line in model.OrderDetails 
        select new 
        { 
         od.ProductID, 
         od.Price, 
         od.Quantity, 
         LineTotal = ModeDefinedFunctions.LineTotal(line) 
        }; 

(2) Wenn Sie eine gespeicherte Prozedur direkt hinzufügen, es einfacher ist, es auf die EDMX Designer per Drag & Drop. Es gibt ein [FunctionImport()] Attribut, aber ich habe es nicht benutzt. Sie können per Drag & Drop sehen, welchen Code in der EDMX-Datei generiert wird?

Alternativ können Sie die model.ExecuteCommand(<spname> , params object[] values ) gespeicherte Prozedur Ausführungsmethode aufrufen. nur Produktnamen von meinem Tisch will basierend auf Produkt-ID