Overblog Suivre ce blog
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:40

II ADO.NET Entity Framework

 

1-Utilisation directe des POCO générées avec EDM
Exemple on a une ObservableCollection<Article> .Article étant généré avec le designer EDM.
Peu de changements par rapport à LINQ To SQL .Les changements se font de manière transparente. Seuls l’ajout et la modification demandent un peu de code.
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.Articles.Local.Contains(newArticle))
                    context.Articles.Add(newArticle);
            }
            if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                Article oldArticle = e.OldItems[0] as Article;
 
                if (context.Articles.Local.Contains(oldArticle))
                    context.Articles.Remove(oldArticle);
            }
                     
        }
 
        private void CurrentArticle_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
 
        }

 

2- N-Tiers

alldata2.png
 
ViewModel
   private void Articles_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                ArticleModel newArticle = e.NewItems[0] as ArticleModel;
                newArticle.ArticleID = Guid.NewGuid();
                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);
        }

 

Service
  public class ArticleService :IArticleService
    {
        private DbTradingEntities context = new DbTradingEntities();
 
        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.Articles.ToList());
        }
 
        public void Add(ArticleModel model)
        {
            context.Articles.Add(model.ToEntity());
                     
        }
 
        public void Update(ArticleModel model)
        {
            if (context.Articles.Where(a => a.ArticleID == model.ArticleID).Count() > 0)
            {
                Article oldArticle = context.Articles.Single(a => a.ArticleID == model.ArticleID);
                context.Entry(oldArticle).CurrentValues.SetValues(model.ToEntity());
            }
                    
            if (context.Articles.Local.Where(a => a.ArticleID == model.ArticleID).Count() > 0)
            {
                Article oldArticle = context.Articles.Local.Single(a => a.ArticleID == model.ArticleID);
                context.Entry(oldArticle).CurrentValues.SetValues(model.ToEntity());
            }                      
                    
        }
 
        public void Remove(ArticleModel model)
        {
 
            if (context.Articles.Where(a => a.ArticleID == model.ArticleID).Count() > 0)
            {
                Article oldArticle = context.Articles.Single(a => a.ArticleID == model.ArticleID);
                context.Articles.Remove(oldArticle);
            }
            // Local (un élément qui vient d'être ajouté)
            if (context.Articles.Local.Where(a => a.ArticleID == model.ArticleID).Count() > 0)
            {
                Article oldArticle = context.Articles.Local.Single(a => a.ArticleID == model.ArticleID);
                context.Articles.Local.Remove(oldArticle);
            }
                     
        }
 
        public int SaveAll()
        {
           return context.SaveChanges();
        }
 
    }

 

Mapper identique à celui pour LINQ To SQL
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;
             }
       }
 

 

Enfin,Il est possible de vérifier l’EntityState des lignes à insérer,modifier,supprimer en passant .Je donne des informations pour cela dans un précédent post
Repost 0
Published by Romagny13 - dans Entity Framework
commenter cet article
8 mars 2014 6 08 /03 /mars /2014 15:35

1-EntityState /Ajout d’entité au contexte
 
Exemple pour ajouter on peut :
dbTradingEntities context = new dbTradingEntities();
Article newArticle=new Article() { ArticleID = Guid.NewGuid(), ArticleName = "Superbe jeans", CategoryID = 1, CollectionID = 1, Description = "...", GenderName = "Homme", Reference = "ref 000", UnitPrice = 10.00m };

 
Soit
context.Article.Add(newArticle);
context.SaveChanges();  
Soit on définit l’entityState comme ajouté
context.Entry<Article>(newArticle).State = EntityState.Added;
context.SaveChanges();  
2- EntityState /Modification d’entité
 Article oldArticle = context.Article.Where(a=>a.ArticleID==new Guid("9E1ABF59-7E6F-42BF-8D6F-4C48E8E95863")).First<Article>();
  
oldArticle.ArticleName = "Joli jeans";
context.Article.Attach(oldArticle); // état unchanged malgré les modifications
//
context.Entry<Article>(oldArticle).State = EntityState.Modified; // change l'état et pourra être sauvé
  
context.SaveChanges();



+ marquer un élément comme à suprrimer
context.Entry<Article>(article).State = EntityState.Deleted;

 

 
3-DbEntityEntry/Obtenir les valeurs courantes,originales,l’état d’une entité ou propriété
DbEntityEntry<Article> entry = context.Entry(oldArticle);
 
entry.CurrentValues
entry.OriginalValues
entry.Entity.ArticleID
entry.State
context.Entry(oldArticle).Property(a => a.ArticleName).CurrentValue ;
context.Entry(oldArticle).Property(a => a.ArticleName).OriginalValue ;

 

var errors = context.Entry(oldArticle).Property(a => a.ArticleName).GetValidationErrors() ;

 

Savoir si une propriété a été modifiée ou la marquer comme modifiée ?
bool isModified = context.Entry(oldArticle).Property(a => a.ArticleName).IsModified;
// ou
bool isModified = context.Entry(oldArticle).Property("ArticleName").IsModified;
 
4-ObjectContext/Récupérer la clé primaire
Obtenir un objectContext
var objectContext = ((IObjectContextAdapter)context).ObjectContext;

 

EntityKey key = objectContext.ObjectStateManager.GetObjectStateEntry(entry.Entity).EntityKey;
  
MessageBox.Show("clé : " + key.EntityKeyValues[0].Key.ToString() + " ,valeur : " + key.EntityKeyValues[0].Value.ToString());

 

  
5-Récupérer les éléments « added,modified,deleted »
On ne peut récupérer les éléments ajoutés qu’avec la collection Local
foreach (Article article in context.Article)
            {
                switch (context.Entry<Article>(article).State)
                {
                    case EntityState.Modified:
                        break;
                    case EntityState.Deleted:
                        break;
 
                }
            }
            foreach (Article article in context.Article.Local)
            {
                switch (context.Entry<Article>(article).State)
                {
                    case EntityState.Added:
                        break;
                }
            }



Exemple : la méthode d’ajout, modification, suppression ne change rien (ajout local,changement de l’état,…)
Added
Article newArticle = new Article() { ArticleID = Guid.NewGuid(), ArticleName = "Test", CategoryID = 1, CollectionID = 1, Description = "...", GenderName = "Homme", Reference = "ref 000", UnitPrice = 10.00m };
//context.Article.Local.Add(newArticle);
//context.Article.Add(newArticle);
context.Entry<Article>(newArticle).State = EntityState.Added;

 

Modified

 

Article modifiedArticle = context.Article.Where(a => a.ArticleID == new Guid("7C6B7C65-79CA-473C-8243-357DF2E7A4EB")).First<Article>();

modifiedArticle.ArticleName = "nouveau nom d'article";

context.Entry<Article>(modifiedArticle).State = EntityState.Modified;



Deleted

 

Article article = context.Article.First();
//context.Article.Local.Remove(article);
context.Article.Remove(article);

 

 
6-Accès concurrentiels

 

7-SqlQuery et ExecuteSql
// requête select
var articles =context.Database.SqlQuery<string>("select [ArticleName] from [dbo].[Article]").ToList();

       

//
context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Article] where [ArticleID]='041D2ADC-61DC-487C-8E3B-62DB6BA383D0' ");

 

ressources
Repost 0
Published by Romagny13 - dans Entity Framework
commenter cet article
8 mars 2014 6 08 /03 /mars /2014 01:37

 

 

Exemple nous avons :

  •         une entité Article 
  •          un model ArticleModel     

On crée deux méthodes d’extension pour le mapping

 

public static class ArticleMapper

    {

        public static ArticleModel ToModel(this Article entity)

        {

            ArticleModel model = new ArticleModel()

            {

                ArticleID = entity.ArticleID,

                Reference=entity.Reference,

                ArticleName = entity.ArticleName,

                Description = entity.Description,

                GenderName = entity.GenderName,

 

            };

 

            return model;

        }

 

        public static Article ToEntity(this ArticleModel model)

        {

            Article entity = new Article()

            {

                ArticleID = model.ArticleID,

                Reference = model.Reference,

                ArticleName = model.ArticleName,

                Description = model.Description,

                GenderName = model.GenderName

            };

 

 

            return entity;

        }

    }

 

 

public interface IServiceBase<TModelBase,TEntity>

    {

        List<TModelBase> GetAll();

        TModelBase Add(TModelBase entity);

        TModelBase Update(TModelBase entity);

        TModelBase Remove(TModelBase entity);

        int SaveAll();

    }

public class ArticleEDMService : IServiceBase<ArticleModel, Article>

    {

        private dbTradingEntities db = new dbTradingEntities();

 

        public List<ArticleModel> GetAll()

        {

            // renvoie toutes les photos

            //var photos = db.Articles.Where(a => a.Photo.Any()).ToList();

 

            foreach (Article entity in db.Article)

            {

                // filtre

                entity.Photo = db.Photo.Where(photo => photo.Article.Any(article => article.ArticleID == entity.ArticleID)).ToList();

 

                entity.ArticleSizes = db.ArticleSizes.Where(articleSize => articleSize.Article.ArticleID == entity.ArticleID).ToList();

            }

 

            return MapToModel(db.Article);

        }

        protected virtual List<ArticleModel> MapToModel(DbSet<Article> articles)

        {

            List<ArticleModel> result = new List<ArticleModel>();

 

            foreach (Article article in articles)

                result.Add(article.ToModel());

 

            return result;

        }

        // ......

}

 

  Include
 Exemple chargement des photos de l’article
 

var articles = context.Article.Include(a=>a.Photo).ToList();

 

Chargement explicite
context.Entry(oldArticleClone).Collection(a=>a .Photo).Load();
   
       

On peut remarquer que les data annotations + IDataErrorInfo marchent en windows form    

Il est intéressant également de voir que le binding se fait bien avec une liste ou une bindinglist et on peut sauver les changements facilement .Ce qui n’est pas le cas si on utilise le mapping qui demande un peu plus de code et de gérer l’objectContext

     

Repost 0
Published by Romagny13 - dans Entity Framework
commenter cet article
2 février 2014 7 02 /02 /février /2014 01:42
  

Chargement simple    

List<Client> clients = dbDemo.Clients.ToList();

 

SqlQuery    

var query = dbDemo.Clients.SqlQuery("Select * from [dbo].[Client] where [CategoryId] = 1");

// ou

List<Client> clients = (dbDemo.Clients.SqlQuery("Select * from [dbo].[Client] where [CategoryId] = 1")).ToList();

 

SaveChanges    

insertion    

dbDemo.Clients.Add(new Client() { Name = "Venturi Léa", Email = "ventl77@live.com", CategoryId = 1 });

int num = dbDemo.SaveChanges();

 

Modification    

var client = (from c in dbDemo.Clients

                        where c.Id == 2

                        select c).FirstOrDefault();

// ou

Client client = (from c in dbDemo.Clients

                        where c.Id == 2

                        select c).FirstOrDefault();

 

client.Email = "dupond133@yahoo.fr";

 

int num = dbDemo.SaveChanges();

 

Suppression    

Client client = (from c in dbDemo.Clients

                        where c.Id == 19

                        select c).FirstOrDefault();

 

dbDemo.Clients.Remove(client);

int num = dbDemo.SaveChanges();

 

 

http://www.entityframeworktutorial.net/EntityFramework4.3/Introduction.aspx    

How do i vidéos pour ADO.NET Entity Framework  

http://msdn.microsoft.com/en-us/vstudio/bb798022

Repost 0
Published by Romagny13 - dans Entity Framework
commenter cet article
2 février 2014 7 02 /02 /février /2014 01:41

    wpfbind2-copie-1.png

  1. Créer un nouveau projet
  2. Ajouter un nouvel élémentADO.NET Entity Data Model (*.edmx)
  3. Sélectionner la base de données SQL Server (ou Modèle vide)
  4. Puis les tables et important les procédures stockées .C’est grâce à elles que les objets vont être créés dans le projet pour accéder à la base .

Des classes avec properties sont générées pour :

  • Chaque table
  • Chaque procédure stockée « Select »

 

Les méthodes se trouvent dans la classe « Entities » (définie après la sélection de la base de données) (fichier *.Context .cs)

Après c’est tout simple il suffit d’instancier un objet de la classe « Entities » pour utiliser les méthodes  

wpfbind3.png  

Exemple 2 WPF Forms /une form liste des clients /une form détail pour l’ajout et modification de clients  

MainWindow /Liste

  • SI l’ItemTemplate de la listBox n’est pas défini , la méthode ToString() est appelée pour afficher les objets
  • Je passe l’objet(un « client » ici) à modifier .

public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

 

            dbDemoEntities dbDemo = new dbDemoEntities();

            // GetAll / liste       

            ObjectResult<GetAllFromClient_Result> clients = dbDemo.GetAllFromClient();

            lstClients.ItemsSource = clients;

 

 

        }

 

        private dbDemoEntities dbDemo;

 

        private void lstClients_MouseDoubleClick(object sender, MouseButtonEventArgs e)

        {

            // on récupère le "client" sélectionné dans la listBox avec (GetAllFromClient_Result)lstClients.SelectedItem

            ClientDetailWindow clientDetailWindow = new ClientDetailWindow((GetAllFromClient_Result)lstClients.SelectedItem);

            clientDetailWindow.ShowDialog();

 

            GetClients();

        }

        private void GetClients()

        {

            ObjectResult<GetAllFromClient_Result> clients = dbDemo.GetAllFromClient();

            lstClients.ItemsSource = clients;

        }

 

        private void btnGetClient_Click(object sender, RoutedEventArgs e)

        {

            ClientDetailWindow clientDetailWindow = new ClientDetailWindow();

            clientDetailWindow.ShowDialog(); 

            GetClients();         

        }

 

        private void btnDeleteClient_Click(object sender, RoutedEventArgs e)

        {

            if (MessageBox.Show(string.Format("Voulez-vous supprimer ce client : {0} ? ", ((GetAllFromClient_Result)lstClients.SelectedItem).Name), "Supprimer un client", MessageBoxButton.OKCancel, MessageBoxImage.Exclamation) == MessageBoxResult.OK)

            {

                dbDemo.DeleteClient(((GetAllFromClient_Result)lstClients.SelectedItem).Id);

                GetClients();

            }

        }

     

    }

}

 

<Grid >

        <ListBox Name="lstClients" HorizontalAlignment="Left" Height="201" Margin="10,10,0,0" VerticalAlignment="Top" Width="482" MouseDoubleClick="lstClients_MouseDoubleClick" />

        <Button Name="btnGetClient" Content="Ajouter un client" HorizontalAlignment="Left" Margin="10,216,0,0" VerticalAlignment="Top" Width="128" Click="btnGetClient_Click"/>

        <Button x:Name="btnDeleteClient" Content="Supprimer le client" HorizontalAlignment="Left" Margin="143,216,0,0" VerticalAlignment="Top" Width="117" Click="btnDeleteClient_Click"/>

</Grid>

 

ClientDetailWindow/Détail

public partial class ClientDetailWindow : Window

    {

        public ClientDetailWindow()

        {

            InitializeComponent();

 

            this.Client = new GetAllFromClient_Result();

            Status = StatusQuery.Add;

 

            DataContext = Client;

            LoadCategories();

        }

 

        public ClientDetailWindow(GetAllFromClient_Result client)

        {

            InitializeComponent();

 

            this.Client = client;

            Status = StatusQuery.Update;

 

            DataContext = Client;

            LoadCategories();

        }

 

        public void LoadCategories()

        {

            ObjectResult<GetAllFromCategory_Result> AllCategories = AllCategories = dbDemo.GetAllFromCategory();

            cboCategoryClient.ItemsSource = AllCategories;

        }

 

        public GetAllFromClient_Result Client { get; set; }

        public StatusQuery Status { get; set; }

        private dbDemoEntities dbDemo = new dbDemoEntities();

 

        private void btnOk_Click(object sender, RoutedEventArgs e)

        {

 

            if (Status == StatusQuery.Add)

                // Insert

                dbDemo.InsertClient(Client.Name, Client.Email, Client.CategoryId);

            else

                // Update

                dbDemo.UpdateClient(Client.Id, Client.Name, Client.Email, Client.CategoryId);

 

            this.DialogResult = true;

        }

 

        private void btnCancel_Click(object sender, RoutedEventArgs e)

        {

           

        }

    }

 

    public enum StatusQuery

    {

        Add,

        Update

    }

 

<StackPanel>

        <Label Name="lblId" Height="23" Content="{Binding Id}"/>

        <TextBox Name="txtName" Height="23" TextWrapping="Wrap" Text="{Binding Name}"/>

        <TextBox Name="txtEmail" Height="23" TextWrapping="Wrap"  Text="{Binding Email}"/>

        <ComboBox Height="20" Name="cboCategoryClient"

                      ItemsSource="{Binding}"

                      DisplayMemberPath="Name"

                      SelectedValuePath="Id"

                      SelectedValue="{Binding CategoryId}"

                      />

 

        <StackPanel Orientation="Horizontal">

            <Button Name="btnOk" Content="Valider" Click="btnOk_Click"/>

            <Button Name="btnCancel" Content="Annuler" Click="btnCancel_Click"/>

        </StackPanel>

 

    </StackPanel>

 

Autre possibilité : utiliser LINQ

Exemple pour filtrer ou trier.

lstClients.ItemsSource = (from c in dbDemo.Client where c.CategoryId == 1 select c.Name).ToList();

Attention aux conversions (toujours très utile la méthode GetType()  pour savoir ce que l’on récupère)

 

Repost 0
Published by Romagny13 - dans Entity Framework
commenter cet article
15 septembre 2007 6 15 /09 /septembre /2007 19:41
Repost 0
Published by Romagny13 - dans Entity Framework
commenter cet article