2011-01-17 8 views
2

Ich muss eine Reihe von kleinen unabhängigen Anwendungen erstellen, die auf ein USB-Gerät kopiert werden können und von dort aus starten können. Also habe ich überlegt, WPF zu verwenden, das zuerst EF-Code verwendet, um eine Verbindung mit einer SQL Server CE-Datenbank herzustellen.Architektur mit SQL Server CE

Meine Frage ist, welche Architektur ich verwenden sollte. Obwohl die Apps eigenständig sind, möchte ich dennoch die UI von der Domäne von den Daten entkoppeln, um eine saubere Trennung der Ebenen zu erreichen. Aber ich möchte es auch nicht zu komplex machen.

Ich möchte also eine UI-Schicht (WPF/MVVM) haben, die die zugrunde liegende Domänenschicht (Domänenobjekte mit Domänenlogik) und Repositorys (die zuerst EF-Code verwenden) verwendet.

Meine Frage ist: Welches Muster sollte ich verwenden, um EF in diesem Fall arbeiten zu lassen? Gibt es irgendwo ein Beispiel, das demonstriert, wie CRUD-Operationen in einem solchen Szenario implementiert werden? Zum Beispiel, sollte ich einen Kontext erstellen und offen lassen; oder sollte ich das Arbeitseinheitsmuster implementieren und Objekte bei Bedarf an einen anderen Kontext anhängen?

Oder würden Sie es auf eine ganz andere Weise tun?

Danke für den Hinweis!

Antwort

2

Der EF-Kontext sollte so kurz wie möglich geöffnet sein. Verwenden Sie es vorzugsweise in einer using-Anweisung.

private static void ApplyItemUpdates(SalesOrderDetail originalItem, 
    SalesOrderDetail updatedItem) 
{ 
    using (AdventureWorksEntities context = 
     new AdventureWorksEntities()) 
    { 
     context.SalesOrderDetails.Attach(updatedItem); 
     // Check if the ID is 0, if it is the item is new. 
     // In this case we need to chage the state to Added. 
     if (updatedItem.SalesOrderDetailID == 0) 
     { 
      // Because the ID is generated by the database we do not need to 
      // set updatedItem.SalesOrderDetailID. 
      context.ObjectStateManager.ChangeObjectState(updatedItem, System.Data.EntityState.Added); 
     } 
     else 
     { 
      // If the SalesOrderDetailID is not 0, then the item is not new 
      // and needs to be updated. Because we already added the 
      // updated object to the context we need to apply the original values. 
      // If we attached originalItem to the context 
      // we would need to apply the current values: 
      // context.ApplyCurrentValues("SalesOrderDetails", updatedItem); 
      // Applying current or original values, changes the state 
      // of the attached object to Modified. 
      context.ApplyOriginalValues("SalesOrderDetails", originalItem); 
     } 
     context.SaveChanges(); 
    } 
} 

Es gibt eine Methode namens anhängen, die Einheiten zu einem Kontext Anhänge,:

private static void AttachRelatedObjects(
    ObjectContext currentContext, 
    SalesOrderHeader detachedOrder, 
    List<SalesOrderDetail> detachedItems) 
{ 
    // Attach the root detachedOrder object to the supplied context. 
    currentContext.Attach(detachedOrder); 

    // Attach each detachedItem to the context, and define each relationship 
    // by attaching the attached SalesOrderDetail object to the EntityCollection on 
    // the SalesOrderDetail navigation property of the now attached detachedOrder. 
    foreach (SalesOrderDetail item in detachedItems) 
    { 
     currentContext.Attach(item); 
     detachedOrder.SalesOrderDetails.Attach(item); 
    } 
} 

http://msdn.microsoft.com/en-us/library/bb896271.aspx

Verwandte Themen