Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

30 mars 2014 7 30 /03 /mars /2014 18:38

2 « méthodes »

Par binding : les opérations d’ajout, modification, suppression se font de manière relativement « transparente » grâce au binding ,le but étant de connecter les opérations d'ajout/suppression/modification entre la couche métier et la couche d'accès aux données .ce jusqu’à ce que l’utilisateur valide les changements (en appuyant sur un bouton appelant SubmitChanges()) avec les risques que cela peut comporter de « dérapages » si tout n’est pas maitrisé .
Par code en contrôlant d’avantage chaque action .Avec par exemple l’ouverture d’une fenêtre édition pour l’ajout et la modification .Même si une fois le binding maitrisé cela revient au même.
I LINQ TO SQL
1-Binding direct
Exemple avec une ObservableCollection<Article>, Article étant l’entité métier générée avec LINQ To SQL
On repère les opérations d’ajout et suppression grâce à l’évènement CollectionChanged
  private void Articles_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                Article newArticle = e.NewItems[0] as Article;
                newArticle.ArticleID = Guid.NewGuid();
 
                if (!context.Article.Contains(newArticle))
                    context.Article.InsertOnSubmit(newArticle);
            }
            if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                Article oldArticle = e.OldItems[0] as Article;
 
                if (context.Article.Contains(oldArticle))
                    context.Article.DeleteOnSubmit(oldArticle);
                if (context.GetChangeSet().Inserts.Contains(oldArticle))
                    context.Article.DeleteOnSubmit(oldArticle);
            }
        }
private void CurrentArticle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { }

 

La modification se fait de manière totalement transparente. Mais si on voulait pouvoir la contrôler il faudrait s’abonner l’évènement PropertyChanged de l’élément courant

 

2-ChangeSet :
Vous pouvez vérifier les éléments « Inserts,Updates,Deletes » qui seront mis à jour au prochain « SubmitChanges » .A savoir que les éléments sont en lecture seule .
private TradingDataContext context = new TradingDataContext();
ChangeSet changeSet = context.GetChangeSet();

 

changeSet.Inserts
changeSet.Updates
changeSet.Deletes

 

3- N-Tiers – Mapping
aalldata1.png
 
On peut préférer avoir une application bien découplée et ne pas travailler directement avec les entités générées par LINQ To SQL ou EDM. Le but ici sera d'arriver à synchroniser correctement les actions ajout/Suppression/Modification entre les différentes couches .
Par exemple avec MVVVM ,J’ai :
ArticleModel
Article
et ArticleMapper permettant de faire le mapping entre le modèle et l’entité métier
Dans mon ViewModel
J’ai une ObservabelCollection<ArticleModel> et un CurrentArticle pour lequel je m’abonne à l’évènement PropertyChanged .
private void Articles_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                ArticleModel newArticle = e.NewItems[0] as ArticleModel;
                articleService.Add(newArticle);
            }
            if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                  ArticleModel oldArticle = e.OldItems[0] as ArticleModel;
                  articleService.Remove(oldArticle);
            }
        }
 
private void CurrentArticle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
 
                articleService.Update(CurrentArticle);
        }

 

Dans ArticleService
  public class ArticleService :IArticleService
    {
        private TradingDataContext context = new TradingDataContext();
 
 
        private List<ArticleModel> MapToModel(List<Article> articles)
        {
            List<ArticleModel> result = new List<ArticleModel>();
            foreach (Article article in articles)
            {
                result.Add(article.ToModel());
            }
 
            return result;
        }
 
        public List<ArticleModel> GetAll()
        {
            return MapToModel(context.Article.ToList());
        }
 
        public void Add(ArticleModel model)
        {
            context.Article.InsertOnSubmit(model.ToEntity());
 
        }
 
        public void Update(ArticleModel model)
        {
            if (context.Article.Where(a => a.ArticleID == model.ArticleID).Count() > 0)
            {
                Article oldArticle = context.Article.Single(a => a.ArticleID == model.ArticleID);
                context.Article.Attach(model.ToEntity(), oldArticle);
            }
 
            if (context.GetChangeSet().Inserts.Count(c => ((Article)c).ArticleID == model.ArticleID) > 0)
            {
                Article oldArticle = (Article)context.GetChangeSet().Inserts.Single(a => ((Article)a).ArticleID == model.ArticleID);
                context.Article.DeleteOnSubmit(oldArticle);
                context.Article.InsertOnSubmit(model.ToEntity());
            }
 
        }
 
        public void Remove(ArticleModel model)
        {
            Article oldArticle =  context.Article.Single(a => a.ArticleID == model.ArticleID);
 
            if (context.Article.Contains(oldArticle))
                context.Article.DeleteOnSubmit(oldArticle);
            if (context.GetChangeSet().Inserts.Contains(oldArticle))
               context.Article.DeleteOnSubmit(oldArticle);
        }
 
        public void SaveAll()
        {
            context.SubmitChanges();
        }
    }



Le Mapper – « Collection » correspond à une colonne de clé étrangère(CollectionID) .Attention à ne pas créer de nouvelle instance dans le sens model > Linq car sinon cela serait vu comme un élément à insérer(en gros une nouvelle collection à insérer dans la base de données)

public static class ArticleMapper
       {
        // DB > MODEL
             public static ArticleModel ToModel(this Article entity)
             {
                    ArticleModel model = new ArticleModel()
                    {
                           ArticleID = entity.ArticleID,
                           ArticleName = entity.ArticleName,
                           Description = entity.Description,
                           UnitPrice = entity.UnitPrice,
                           Collection = new CollectionModel() { CollectionID = entity.Collection.CollectionID,  CollectionName = entity.Collection.CollectionName }         
            };
                    return model;
       }
 
        // MODEL > DB
             public static Article ToEntity(this ArticleModel model)
             {
                    Article entity = new Article()
                    {
                           ArticleID = model.ArticleID,
                           ArticleName = model.ArticleName,
                           Description = model.Description,
                           UnitPrice = model.UnitPrice,
                           CollectionID = model.Collection.CollectionID,
                          
                    };
                    return entity;
             }
       }
 

Partager cet article

Repost 0
Published by Romagny13 - dans Linq To SQL
commenter cet article

commentaires