2009-03-07 9 views
1

Ich arbeite an einer 3-Tier-Web-Anwendung, wo ich das Microsoft Entity Framework verwende. Um eine lose Kopplung zwischen den verschiedenen Schichten zu machen, die Datenübertragungsobjekte verwenden, um zwischen den Entity Framework-Objekten und meinen benutzerdefinierten Objekten zu übertragen, habe ich ein Problem mit der Übersetzungsgeschwindigkeit zwischen dem Entitätsframework und meinen benutzerdefinierten DTOs. Ich benutze diese Methode von EF auf DTO zu übertragen:Data Transfer Objects und Entity Framework

public List Transform(List carModelDefinition) {

 List<CarDefinitionDTO> cdDTOList = new List<CarDefinitionDTO>(); 
     foreach (DataLayer.CarModelDefinition cmd in carModelDefinition) 
     { 
      CarDefinitionDTO cdDTO = new CarDefinitionDTO(); 
      cdDTO.CarDefinitionId = cmd.CarModelDefinitionId; 
      cdDTO.Compagny = cmd.Company; 
      cdDTO.Model = cmd.Model; 
      cdDTOList.Add(cdDTO); 
     } 
     return cdDTOList; 

} 

Aber wenn ich versuche, eine Liste von zum Beispiel zu übertragen 600 Elemente dauert ca. 10 Sekunden. Mache ich etwas falsch oder ist die Geschwindigkeit einfach so langsam? NB. Ich arbeite an einem ziemlich schnellen PC, so dass es nicht die Geschwindigkeit meines PCs ist, die es verlangsamt.

+0

Da Sie gefunden haben und das Problem behoben, wäre gut für Sie, diese Frage zu aktualisieren, so dass zukünftige Leser lernen können - oder zumindest nicht sein irregeführt. – Bevan

Antwort

1

Der von Ihnen gepostete Code übersetzt nicht nur zwischen dem EF-Typ und dem DTO-Typ, sondern auch die Daten aus der Datenbank. Versuchen Sie, die beiden zu Messzwecken zu trennen. Es ist sehr wahrscheinlich, dass die Datenwiederherstellung 10 Sekunden dauert und nicht die Zeit, in der Daten im Speicher verschoben werden.

+0

Ich sehe nicht, wo ich mit der Datenbank in dieser Funktion interagiere? Ich erstelle normalerweise eine neue Liste von einer Liste, die der Parameter ist? –

+0

Ich habe das vielleicht falsch gelesen. Warum übergeben und geben Sie "List" anstelle von List und List zurück? Was ist der tatsächliche Parameter für den Methodenaufruf? Sind Sie sicher, dass es nur eine Liste und kein IQueryable ist? –

+0

Ich weiß nicht, ob Sie die Func-Definition oben (öffentliche List Transformation (List carModelDefinition)) gesehen haben. Ich gebe ein DTO anstelle von Datalayer.Carmodeldefinition zurück, weil ich in der UI keine Kopplung zwischen DataLayer und der UI möchte - daher verwende ich DTOs. –

0

ich laden Sie es mit den Worten:

 public List<CarDefinitionDTO> LoadAll() 
    { 
     List<DataLayer.CarModelDefinition> carList = (from cd in mee.CarModelDefinition select cd).ToList(); 
     CarDefinitionDTO cdDTO = new CarDefinitionDTO(); 
     List<CarDefinitionDTO> carDefList = cdDTO.Transform(carList); 
     return carDefList; 
    } 
2

ich den Fehler gefunden. Im Konstruktor erstelle ich die Instanz des Entity Managers, und wenn ich ein neues Objekt erstellte, würde es ständig eine neue Instanz erstellen, was ziemlich zeitaufwändig war.

0

TROCKEN! Versuchen Sie, einen DTO/Assembler-Generator wie EntitiesToDTOs zu verwenden. Es generiert DTOs und Assembler aus Ihrer Entity Framework EDMX-Datei. diese Weise werden Sie nicht jedes Entity/DTO Mapping-Code müssen, Combiner werden Erweiterungsmethoden auf Ihre Entitäten und erzeugt DTOs hinzufügen, damit Sie Codierung am Ende wie folgt:

var myCar = new Car(); 
CarDTO dto = myCar.ToDTO(); 
myCar = dto.ToEntity(); 

oder:

ICollection<Car> carCol = new List<Car>(); 
ICollection<CarDTO> carDTOs = carCol.ToDTOs(); 
carCol = carDTOs.ToEntities(); 

Ziemlich einfach und das Werkzeug ist wirklich einfach zu bedienen.