2016-03-24 21 views
0

Ich habe das Problem mit der Zuordnung einer gespeicherten Prozedur zu einer EF-Entität, die von der Ansicht in der Datenbank dargestellt wird.Zuordnen gespeicherter Prozeduren zu Sichten

Wenn ich zu nennen versuchen, zum Beispiel ein .Add Verfahren - erhalten den Fehler

Zu viele Parameter ...

Ich weiß,/verstehen, dass EF alle Parameter der will Entity außer Schlüssel (+ berechnet) in der zugeordneten Add - Stored Procedure. Aber im Fall von "entity = view" möchte ich als gespeicherte Prozedurparameter nur einige Sätze von EF-Entitätsfeldern, die ich in der db-Tabelle habe (ein Feld für den Fall der Einfügung, ein weiterer Satz für den Fall der Aktualisierung) , dritter Satz im Falle des Löschens).

Wie macht man das "richtig"? In .edmx diese (Abbildung über grafische Oberfläche) funktioniert perfekt, aber ich brauche dieses Verhalten in der Code-zuerst von Hand zu realisieren ..

Beispiel:

Blick in DB ..

CREATE VIEW vDepartment 
AS 
    SELECT 
     d.*, 
     dp.Code as ParentCode, dp.SName as ParentSName, 
     dp.Name as ParentName 
    FROM 
     Department d 
    LEFT OUTER JOIN 
     Department dp ON d.ParentID = dp.ID 

EF Einheit

public partial class vDepartment 
{ 
    public long ID { get; set; } 
    public Nullable<long> ParentID { get; set; } 
    public string Code { get; set; } 
    public string SName { get; set; } 
    public string Name { get; set; } 
    public Nullable<System.DateTime> CloseDate { get; set; } 
    public string ParentCode { get; set; } 
    public string ParentSName { get; set; } 
    public string ParentName { get; set; } 
} 

Mapping ..

modelBuilder.Entity<vDepartment>().MapToStoredProcedures(s => 
      { 
       s.Update(u => u.HasName("udp_Department_upd")); 
       s.Delete(d => d.HasName("udp_Department_del")); 
       s.Insert(i => i.HasName("udp_Department_ins").Result(r => r.ID, "NewID")); 
      }); 

Einfügen gespeicherte Prozedur in der Datenbank:

CREATE PROC [dbo].[udp_Department_ins] 
    @ParentID BIGINT, 
    @Code  NVARCHAR(20), 
    @SName  NVARCHAR(50), 
    @Name  NVARCHAR(100), 
    @CloseDate DATE 
AS 
BEGIN 
    DECLARE @NewID bigint; 

    INSERT INTO Department... 
     SELECT @NewID AS NewID; 
END; 
+0

Wenn Sie Ihre gespeicherten Proc-Mappings definieren, gibt es mehr Optionen, um die Parameter für jeden gespeicherten Proc zu definieren? – Brad

+0

Ich habe versucht, so zu beschreiben, habe aber den gleichen Fehler. s.Insert (i => i.HasName ("udp_Department_ins") .Parameter (e => e.ParentID, "ParentID") .Parameter (e => e.Code, "Code") .Parameter (e => e.SName, "SName") .Parameter (e => e.Name, "Name") .Parameter (e => e.CloseDate, "CloseDate") .Ergebnis (r => r.ID "NewID") ); – Valerdos

+0

Sie versuchen, den ersten Ansatz des Codes für ein erstes Datenbanksystem zu erzwingen. Meiner Erfahrung nach war die Zuordnung von Ansichten zu Entitäten immer unidirektional (Datenbank zu POCOs) und beinhaltete keine Einfügungen, Aktualisierungen oder Löschungen unter Verwendung von gespeicherten Procs. Ich schlage vor, ein POCO zu erstellen, das Eigenschaften enthält, um nur die Parameter Ihres eingefügten gespeicherten proc zuzuordnen.Dies ist jedoch nicht der erste Weg und fügt Ihrer Datenschicht unnötige Komplexität hinzu. – Brad

Antwort

0

können Sie tun:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string ParentSName { get; set; } 
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string ParentName { get; set; } 

ParentSName und Parent zu verhindern angeboten als Parameter der gespeicherten Prozedur werden. Beachten Sie, dass dies nicht bedeutet, dass diese Spalten tatsächlich berechnete Spalten in Ihrer Datenbank sein müssen. Effektiv markiert es sie als nicht update-/readonly zu EF.

Ich habe keinen direkten Weg gefunden, die Zuordnung zu einem Parameter für eine bestimmte gespeicherte Prozedur zu ignorieren, wie im Edmx-Designer.

Und denken Sie daran, die berechneten Spalten als Ausgabe Ihrer gespeicherten Prozedur hinzuzufügen. Dies kann erforderlich sein oder auch nicht, wenn sich diese Werte in der Datenbank bei der Aktualisierung ändern.

s.Insert(i => i.HasName("udp_Department_ins").Result(r => r.ID, "NewID").Result(r => r.ParentName , "ParentName") 
Verwandte Themen