2011-01-17 5 views
2

Je dois créer un certain nombre de petites applications indépendantes, qui peuvent être copiées sur un périphérique USB et exécutées à partir de là. Je pensais donc à utiliser WPF, qui utilise d'abord le code EF pour se connecter à une base de données SQL Server CE.Architecture avec SQL Server CE

Ma question concerne l'architecture que je devrais utiliser. Bien que les applications soient autonomes, j'aimerais toujours découpler l'interface utilisateur du domaine des données, pour avoir une séparation nette des couches. Mais je ne veux pas non plus le rendre trop complexe. Donc, je veux avoir une couche d'interface utilisateur (WPF/MVVM) qui utilise la couche de domaine sous-jacente (objets de domaine avec logique de domaine) et les référentiels (qui utilisent d'abord le code EF).

Ma question est: quel modèle devrais-je utiliser pour faire fonctionner EF dans ce cas? Y a-t-il quelque part un exemple qui montre comment implémenter des opérations CRUD dans un tel scénario? Par exemple, devrais-je créer un contexte et le laisser ouvert? ou devrais-je implémenter le modèle d'unité de travail et attacher des objets à d'autres contextes si nécessaire?

Ou le feriez-vous d'une manière totalement différente?

Merci pour le conseil!

Répondre

2

Le contexte EF doit être ouvert aussi rapidement que possible. Utilisez de préférence dans une déclaration d'utilisation.

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(); 
    } 
} 

Il y a une méthode appelée Joindre, qui Attachs entités à un contexte:

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