Calendrier

Décembre 2009
L M M J V S D
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
<< < > >>

Présentation

Recherche

W3C

  • Flux RSS des articles

ADO Entity Model

Vidéo de démonstration du designer Entity Data Model

http://blogs.msdn.com/adonet/archive/2007/10/26/entity-data-model-designer-video.aspx

Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander
Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander
ADO.NET Entity Framework Beta 2 - MSDN Library

documentation en ligne pour ADO.NET Entity Framework Beta 2 
http://msdn2.microsoft.com/en-us/library/bb739441(vs.90).aspx

Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander

Articles ADO.NET Entity Framework - Blog de Mike taulty

Mike Taulty vient de poster une série d'articles(22) sur ADO.NET Entity Framework

http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/category/1024.aspx 

A ne pas manquer la vidéo qu'il a faite (environ 38 minutes)
http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2007/08/27/9604.aspx

Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander
ADO.NET Entity Framework Beta 2 disponible

-ADO.NET Entity Framework Beta 2
http://www.microsoft.com/downloads/details.aspx?FamilyId=F1ADC5D1-A42E-40A6-A68C-A42EE11186F7&displaylang=en

- ADO.Net Entity Framework Tools Aug 07 Community Technology Preview
http://www.microsoft.com/downloads/details.aspx?FamilyId=09A36081-5ED1-4648-B995-6239D0B77CB5&displaylang=en

- samples
http://www.codeplex.com/adonetsamples/

ADO.NET Team Blog
http://blogs.msdn.com/adonet/archive/2007/08/27/entity-framework-beta-2-the-1st-entity-framework-tools-ctp-released.aspx


Donc rapidement on ne peut toujours que générer un Model pour SQL Server ou un fichier de base de données SQL Server 2005 Express (pas Access,... pour l'instant)
2 captures ... en attendant certainement de nouveaux posts
 
ADOModel1.JPG

le designer dans Visual Studio 2008

ADOModel3.JPG
la dll System.Data.Entity est installée par défaut dans :  
C:/Program Files/Reference Assemblies/Microsoft/Framework/v3.5/System.Data.Entity.dll
.. oui oui Reflector est notre ami :) :p
Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander
Linq To Entities – différences avec Linq To SQL
La première question que l’on se pose c’est quelle est la différence entre Linq To SQL et Linq To Entities
-          Linq To SQL repose sur le mapping par attributs
-          Linq To Entities repose sur le mapping par fichier Xml
L’avantage de Linq To Entites est qu’en cas de modification du nom d’une colonne de table de la base de données vers laquelle pointe le model, il suffit de modifier le nom dans les fichiers Xml sans avoir besoin d’avoir accéder au source de l’application
 

Au niveau du code à première vue pas d’énormes différences avec Linq To SQL sauf quand même que l’entity model repose sur System.Data.Objects ett non pas sur System.Data.Linq .. ce qu’il m’a valu quelques surprises comme  : certaines méthodes qui ne peuvent pas être utilisées dans les requêtes Linq (exemple : la méthode First())

La ou Linq To SQL définit un DataContext qui hérite
System.Data.Linq.DataContext
Linq To Entites définit un DBEntities qui hérite de
System.Data.Objects.ObjectContext
Linq To SQL contient une classe par table sur la base de données
Chaque classe a un attribut [global::System.Data.Linq.Table()]
-          Implémente System.Data.Linq.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
Le model contient une classe par table sur la base de données
Chaque classe hérite de System.Data.Objects.DataClasses.Entity
Et d’un attribut qui donne les informations vers le fichier Xml pour retrouver le mapping
[System.Data.Objects.DataClasses.EntityTypeAttribute()]
-          Implémente ReportPropertyChanging et ReportPropertyChanged afin denotifier des changements
Chaque property a un attribute [global::System.Data.Linq.Column()]
 
Chaque property a des attributs dont [System.Data.Objects.DataClasses.NullableAttribute(true)]
Indiquant si les valeurs nll sont acceptées (par rapport à AllowDBNull)
 
Mais l’utilisation est vraiment similaire
On définit un objet pour le Model avec Linq To Entities (alors que l’on utilise le Datacontext avec Linq To SQL)
ContactDBModel.ContactDBEntities oContactDBEntities;
 
Et  un objet pour chaque  classe et on utilise SaveChanges() du DBEntities, au lieu lieu de SubmitChanges avec le datacontext
           ContactDBModel.ContactType oContactType;
            oContactType = new ContactDBModel.ContactType();
 
            oContactType.ContactTypeLibelle = "Test Model";
 
 
            oContactDBEntities.AddObject(oContactType);
            oContactDBEntities.SaveChanges();
 
Une différence tout de même on accès directement à l’état (EntityState) de chaque objet métier (Unchanged,Added,etc.)
           var Query =
                from c in oContactDBEntities.ContactType
                 select c;
 
            List<ContactDBModel.ContactType> List = new List<ContactDBModel.ContactType>();
            //foreach (ContactDBModel.ContactType oContactType in Query)
            //{
            //    List.AddRange(oContactType);
            //}
            // ou
            List.AddRange(Query);
            MessageBox.Show(List[0].EntityState.ToString());
Par Romagny13
Ecrire un commentaire - Voir les 3 commentaires - Recommander
Code complet
Exemple : en base de données une colonne de ma table ContactType s’appelait au départ ContactTypeLib
Puis je l’ai renommée ContactTypeLibelle,
J’ai alors modifié seulement les noms dans les fichiers de mappings (xml), en conservant le nom que j’avais pour mon property donc (toujours ContactTypeLib pour le property)
[assembly: System.Data.Objects.DataClasses.EdmSchemaAttribute("ContactDBModel")]
 
// This file implements the ContactDBModel version 0.0.0.0 namespace.
// Original file name:
// Generation date: 10/05/2007 18:04:35
namespace ContactDBModel
{
   
    ///<summary>
    /// There are no comments for ContactDBEntities in the schema.
    ///</summary>
    public partial class ContactDBEntities : global::System.Data.Objects.ObjectContext
    {
        ///<summary>
        /// Initializes a new ContactDBEntities object using the connection string found in the 'ContactDBEntities' section of the application configuration file.
        ///</summary>
        public ContactDBEntities() :
                base("name=ContactDBEntities", "ContactDBEntities")
        {
        }
        ///<summary>
        /// Initialize a new ContactDBEntities object.
        ///</summary>
        public ContactDBEntities(string connectionString) :
                base(connectionString, "ContactDBEntities")
        {
        }
        ///<summary>
        /// Initialize a new ContactDBEntities object.
        ///</summary>
        public ContactDBEntities(global::System.Data.Common.DbConnection connection, global::System.Data.Metadata.Edm.MetadataWorkspace workspace) :
                base(connection, workspace)
        {
        }
        ///<summary>
        /// There are no comments for ContactDBEntities.Contact in the schema.
        ///</summary>
        public global::System.Data.Objects.ObjectQuery<global::ContactDBModel.Contact> Contact
        {
            get
            {
                return base.CreateQuery<global::ContactDBModel.Contact>("Contact");
            }
        }
        ///<summary>
        /// There are no comments for ContactDBEntities.ContactType in the schema.
        ///</summary>
        public global::System.Data.Objects.ObjectQuery<global::ContactDBModel.ContactType> ContactType
        {
            get
            {
                return base.CreateQuery<global::ContactDBModel.ContactType>("ContactType");
            }
        }
    }
    ///<summary>
    /// There are no comments for ContactDBModel.ContactType in the schema.
    ///</summary>
    ///<KeyProperties>
    /// ContactTypeID
    ///</KeyProperties>
    [System.Data.Objects.DataClasses.EntityTypeAttribute(SchemaName="ContactDBModel", TypeName="ContactType")]
    [System.Runtime.Serialization.DataContractAttribute()]
    public partial class ContactType : global::System.Data.Objects.DataClasses.Entity
    {
        ///<summary>
        /// Initialize a new ContactType object.
        ///</summary>
        public ContactType()
        {
            // Call DoFinalConstruction if this is the most-derived type.
            if ((((object)(this)).GetType() == typeof(global::ContactDBModel.ContactType)))
            {
                this.DoFinalConstruction();
            }
        }
        ///<summary>
        /// Initialize a new ContactType object.
        ///</summary>
        ///<param name="contactTypeID">Initial value of ContactTypeID.</param>
        public ContactType(int contactTypeID)
        {
            this.ContactTypeID = contactTypeID;
 
            // Call DoFinalConstruction if this is the most-derived type.
            if ((((object)(this)).GetType() == typeof(global::ContactDBModel.ContactType)))
            {
                this.DoFinalConstruction();
            }
        }
        ///<summary>
        /// There are no comments for Field ContactTypeID in the schema.
        ///</summary>
        [System.Data.Objects.DataClasses.EntityKeyPropertyAttribute()]
        [System.Runtime.Serialization.DataMemberAttribute()]
        [System.Data.Objects.DataClasses.NullableAttribute(false)]
        public int ContactTypeID
        {
            get
            {
                return this._ContactTypeID;
            }
            set
            {
                this.ReportPropertyChanging("ContactTypeID", this._ContactTypeID);
                this._ContactTypeID = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);
                this.ReportPropertyChanged("ContactTypeID", this._ContactTypeID);
            }
        }
        private int _ContactTypeID;
        ///<summary>
        /// There are no comments for Field ContactTypeLib in the schema.
        ///</summary>
        [System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()]
        [System.Runtime.Serialization.DataMemberAttribute()]
        [System.Data.Objects.DataClasses.NullableAttribute(true)]
        public string ContactTypeLib
        {
            get
            {
                return this._ContactTypeLib;
            }
            set
            {
                this.ReportPropertyChanging("ContactTypeLib", this._ContactTypeLib);
                this._ContactTypeLib = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true, 8000, false);
                this.ReportPropertyChanged("ContactTypeLib", this._ContactTypeLib);
            }
        }
        private string _ContactTypeLib;
    }
}
 
  Model.csdl
<?xmlversion="1.0"encoding="utf-8"?>
<SchemaNamespace="ContactDBModel"Alias="Self"xmlns="http://schemas.microsoft.com/ado/2006/04/edm">
 <EntityContainerName="ContactDBEntities">
    <EntitySetName="Contact"EntityType="ContactDBModel.Contact" />
    <EntitySetName="ContactType"EntityType="ContactDBModel.ContactType" />
 </EntityContainer>
 <EntityTypeName="Contact"Key="ContactID">
    <PropertyName="ContactID"Type="Int32"Nullable="false" />
    <PropertyName="ContactName"Type="String"Nullable="false"MaxLength="8000"Unicode="false"FixedLength="true" />
    <PropertyName="ContactFirstName"Type="String"Nullable="false"MaxLength="8000"Unicode="false"FixedLength="true" />
    <PropertyName="ContactEmail"Type="String"MaxLength="8000"Unicode="false"FixedLength="true" />
    <PropertyName="ContactTypeID"Type="Int32"Nullable="false" />
    <PropertyName="ContactAge"Type="Int32" />
 </EntityType>
 <EntityTypeName="ContactType"Key="ContactTypeID">
    <PropertyName="ContactTypeID"Type="Int32"Nullable="false" />
    <PropertyName="ContactTypeLib"Type="String"MaxLength="8000"Unicode="false"FixedLength="true" />
 </EntityType>
</Schema>
  Model.msl
-          cs:Name : nom du property
-          cs:ColumnName : nom de la colonne dans la table
<?xmlversion="1.0"encoding="utf-8"?>
<Mappingxmlns:cs="urn:schemas-microsoft-com:windows:storage:mapping:CS"cs:Space="C-S"xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
 <cs:EntityContainerMappingcs:StorageEntityContainer="dbo"cs:CdmEntityContainer="ContactDBEntities">
    <cs:EntitySetMappingcs:Name="Contact"cs:TableName="Contact"cs:TypeName="ContactDBModel.Contact">
      <cs:ScalarPropertycs:Name="ContactID"cs:ColumnName="ContactID" />
      <cs:ScalarPropertycs:Name="ContactName"cs:ColumnName="ContactName" />
      <cs:ScalarPropertycs:Name="ContactFirstName"cs:ColumnName="ContactFirstName" />
      <cs:ScalarPropertycs:Name="ContactEmail"cs:ColumnName="ContactEmail" />
      <cs:ScalarPropertycs:Name="ContactTypeID"cs:ColumnName="ContactTypeID" />
      <cs:ScalarPropertycs:Name="ContactAge"cs:ColumnName="ContactAge" />
    </cs:EntitySetMapping>
    <cs:EntitySetMappingcs:Name="ContactType"cs:TableName="ContactType"cs:TypeName="ContactDBModel.ContactType">
      <cs:ScalarPropertycs:Name="ContactTypeID"cs:ColumnName="ContactTypeID" />
      <cs:ScalarPropertycs:Name="ContactTypeLib"cs:ColumnName="ContactTypeLibelle" />
    </cs:EntitySetMapping>
 </cs:EntityContainerMapping>
</Mapping>
 
Model.ssdl
<?xmlversion="1.0"encoding="utf-8"?>
<SchemaNamespace="ContactDB"Alias="Self"xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl">
 <EntityContainerName="dbo">
    <EntitySetName="Contact"EntityType="ContactDB.Contact" />
    <EntitySetName="ContactType"EntityType="ContactDB.ContactType" />
 </EntityContainer>
 <EntityTypeName="Contact"Key="ContactID">
    <PropertyName="ContactID"Type="int"Nullable="false"StoreGeneratedPattern="identity" />
    <PropertyName="ContactName"Type="char"Nullable="false" />
    <PropertyName="ContactFirstName"Type="char"Nullable="false" />
    <PropertyName="ContactEmail"Type="char" />
    <PropertyName="ContactTypeID"Type="int"Nullable="false" />
    <PropertyName="ContactAge"Type="int"
Par Romagny13
Ecrire un commentaire - Voir les commentaires - Recommander