Overblog
Suivre ce blog Administration + Créer mon blog

Présentation

  • : 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
Repost0
25 février 2014 2 25 /02 /février /2014 19:01

I - LINQ TO SQL - Mappage par attributs((System.Data.Linq.Mapping)

Attributs :Database,Table,Column,etc.

 

Quelques propriétés de l’attribut Column
[Table(Name = "Client")]
    public class Clients
    {
        [Column(IsPrimaryKey = true, IsDbGenerated = true)]
        public int Id { get; set; }
 
        [Column(CanBeNull = false)]
        public string Name { get; set; }
 
        [Column]
        public string Email { get; set; }
    }

DataContext

  public class DemoContext : DataContext

    {

        public Table<Clients> Clients { get { return this.GetTable<Clients>(); } }

 

        public DemoContext(string connectionString) : base(connectionString) { }

    }                     

 Note : LINQ TO SQL > DataContext, EDM > ObjectContext
 
Validation avec IDataErrorInfo(exemple en vb) http://blogs.msdn.com/b/bethmassi/archive/2008/02/25/simple-validation-with-linq-to-sql-classes.aspx

De LINQ To SQL à LINQ To XML
DemoContext db = new DemoContext(@"Data Source=.\SQLEXPRESS;Initial Catalog=dbDemo;Integrated Security=SSPI;");
 
        private void btnWriteXml_Click(object sender, RoutedEventArgs e)
        {
            XElement xml = new XElement("clients",
                       from c in db.Clients
                       orderby c.Name
                       select new XElement("client",
                              new XAttribute("Id", c.Id),
                              new XAttribute("Name", c.Name)  
                              )
                       );
            xml.Save(@"C:\Clients.xml");
        }

II - Ressources
Ecrire son propre provider LINQ
Exemples de providers : LINQ to Amazon ,  LINQ to Active Directory ,  LINQ to CRM ,  LINQ To Geo - Language Integrated Query for Geospatial Data ,  LINQ to Excel ,  LINQ to Google,  LINQ to JSON ,  LINQ to NHibernate ,  LINQ to JavaScript ,  LINQ to LLBLGen Pro ,LINQ to Sharepoint ,  LINQ to Streams ,  LINQ to WMI,  etc.

 

Bonnes pratiques

Guidance explorer http://guidanceexplorer.codeplex.com/

Microsoft Application Architecture Guide http://msdn.microsoft.com/en-us/library/dd673617.aspx

Prism http://www.codeplex.com/CompositeWPF
MVVM LIGHT (Silverlight, WPF et Windows Phone) http://www.galasoft.ch/mvvm/

Développer en .NET sur Android et ios

MonoTouch http://xamarin.com/ios
MVVMCross(Mvvm Platform for Xamarin.iOS, Xamarin.Android, WindowsPhone, WindowsStore, WPF and Mac) https://github.com/MvvmCross/MvvmCross

Les modèles

MVC(Model View Controller) http://www.asp.net/mvc
MVP(Model View Presenter) http://jab.developpez.com/tutoriels/dotnet/mvppattern/

VP
MVVM(Model-View-VIewController) http://www.e-naxos.com/Blog/?tag=/mvvm
DAL + BOL + IHM (Data Access Layer,Business Object Layer,interface)
Partager cet article
Repost0
2 février 2014 7 02 /02 /février /2014 01:43

Ajouter un nouvel élément > Classe LINQ To SQL

  • Le fichier de configuration est mis à jour avec la chaine de connexion
  • Le designer permet de glisser les tables et procédures stockées depuis l’explorateur de serveurs

ltsql1.png

 

Diagramme de classes

      ltosql0  

 

DbDemoDataContext context = new DbDemoDataContext();

 

// Get All

var clients = context.Client;

// ou

Table<Client> clients = context.Client;

// procédure stockée

var clients = context.GetAllFromClient();

// ou

List<GetAllFromClientResult> clients = (context.GetAllFromClient()).ToList();

 

// Get One

Client client = context.Client.Where(c => c.Name.StartsWith("B")).FirstOrDefault();

 

// Insert

context.Client.InsertOnSubmit( new Client() { Name = "Oniri Léa", Email = "oniri136@msn.com", CategoryId = 1 });

            context.SubmitChanges();

// procédure stockée (nommée InsertClient)

context.InsertClient("Oniri Léa", "oniri136@msn.com", 1);

 

// Update

Client client = context.Client.Where(c => c.Name == "Bellin Marie").FirstOrDefault();

client.Email = "bellinmarienate@msn.com";

context.SubmitChanges();

// procédure stockée

context.UpdateClient(2, "Bellin Marie", "bellinmarie@live.com", 1);

 

// delete

Client client = context.Client.Where(c => c.Id == 21).FirstOrDefault();

context.Client.DeleteOnSubmit(client);

context.SubmitChanges();

// procédure stockée

context.DeleteClient(21);

 

ExecuteQuery et ExecuteCommand

// ExecuteQuery

var result = context.ExecuteQuery<Client>("Select * from Client where Name LIKE '%be%'");

 

// ExecuteCommand(pour requête insert/Update/delete)

int result = context.ExecuteCommand("Insert into Category(Name) values({0})","Nouvel inscrit");

 

Ressources

http://msdn.microsoft.com/fr-fr/data/cc936565

http://www.techheadbrothers.com/Articles.aspx/linq-360-degre-partie-4-page-1 

Partager cet article
Repost0
16 juin 2007 6 16 /06 /juin /2007 20:57
[Linq To SQL ] – Astuce
Tracer les requêtes SQL exécutées
Très intéressant cela montre la requête SQL executée, et QUAND celle-ci l’est, dans mon exemple ce n’est qu’à la ligne > dataGridView1.DataSource = oContactCategories;
Que la requête est éxécutée
1 – avec la fenêtre Output (sortie)
Ajouter (db étant ici le DataContext)
db.Log = Console.Out;
 
Exemple
ContactDataContext db = new ContactDataContext();
           
            db.Log = Console.Out;
 
            System.Data.Linq.Table<ContactCategory> oContactCategories = db.GetTable<ContactCategory>();
 
            dataGridView1.DataSource = oContactCategories;
 
log1-copie-1.JPG
2 – Avec SQL Server Profiler
A condition bien entendu de disposer de SQL Server 2005 et non pas d’une version Express
log2.JPG
Partager cet article
Repost0