none
Code First : Composite key RRS feed

  • Question

  • Je teste "Code Fisrt" pour generer ma base de donnée mais j'ai un probleme pour creer une Cle primaire avec 2 ( ou plusieurs ) champs dans la cle.
    Voici mom Entité
      [Key, DataMember(Order = 1)]
            public int Bul_MatPerId { get; set; }
            [Key, DataMember(Order = 2)]
            public int Bul_RubBullId { get; set; }
     
            //[Key, DataMember(Order = 1)]
            //public int PlaylistId { get; set; }
            //[Key, DataMember(Order = 2)]
            //public int TrackId { get; set; }
            //[RelatedTo(ForeignKey = "PlaylistId")]
            //public Playlist Playlist { get; set; }
            //[RelatedTo(ForeignKey = "TrackId")]
            //public Track Track { get; set; }
     
            public int Bul_RubBull { get; set; }
            public Decimal Bul_ValBase { get; set; }
            public string Bul_TypBase { get; set; }
            public int Bul_DouBase { get; set; }
            public Decimal Bul_ValPlaf { get; set; }
            public string Bul_TypPlaf { get; set; }
            public int Bul_Douplaf { get; set; }
            public Decimal Bul_ValPlan { get; set; }
            public string Bul_TypPlan { get; set; }
            public int Bul_DouPlan { get; set; }
            public Decimal Bul_ValTaux { get; set; }
            public string Bul_TypTaux { get; set; }
            public int Bul_DouTaux { get; set; }
            public Decimal Bul_ValMont { get; set; }
            public string Bul_TypMont { get; set; }
            public int Bul_DouMont { get; set; }
            public Decimal Bul_ValCumul { get; set; }
    Mais j'ai l'erreur suivante :
    Unable to determine composite primary key ordering for type 'SXamBasePaie_DB.TpaBulletin'. Use the ColumnAttribute or the HasKey method to specify an order for composite primary keys.
    Je suis conscient qu'il manque quelque chose , mais apres trests et recherches je n'arrrive pas .
    Merci pour votre aide , car je pense que je vais adopter Code First
    anthride est actuellement connecté

    jeudi 2 février 2012 10:02

Réponses

  • Alors, je viens de tester. Le code suivant fonctionne chez moi : 

     

    public class MonContext : DbContext
    {
        public DbSet<TpaBulletin> TpaBulletins { get; set; }
    }
    
    public class TpaBulletin
    {
        [Key, Column("Bul_MatPerId", Order = 0)]
        public int Bul_MatPerId { get; set; }
        [Key, Column("Bul_RubBullId", Order = 1)]
        public int Bul_RubBullId { get; set; }
    
        public int Bul_RubBull { get; set; }
    }


    Comme tu peux le voir, j'ai aussi précisé le nom de la colonne qui va bien dans le ColumnAttribute. Peux-tu me confirmer que cela fonctionne bien chez toi ?

    Cordialement,

    Sébastien


    Sébastien Putier
    Consultant - Formateur technologies Microsoft
    Blog : http://sputier.wordpress.com
    MCTS Développement d'application Windows 4.0 / Data Access 4.0
    Si un post vous parait utile, n'oubliez pas de le marquer comme utile. S'il répond à votre question, n'oubliez pas de le marquer comme réponse.
    • Marqué comme réponse Cdes jeudi 2 février 2012 13:24
    jeudi 2 février 2012 11:33

Toutes les réponses

  • Bonjour,

    Il me semble que tu devrais avoir des index commencant à 0, pour tes clés, et utiliser Column au lieu de DataMember : 

     

    [Key, Column(Order = 0)]
    public int Bul_MatPerId { get; set; }
    [Key, Column(Order = 1)]
    public int Bul_RubBullId { get; set; }
    
    (Je n'ai pas la possibilité de tester actuellement. Si besoin, je vérifierai cela plus tard)
    Cordialement,
    Sébastien

     


    Sébastien Putier
    Consultant - Formateur technologies Microsoft
    Blog : http://sputier.wordpress.com
    MCTS Développement d'application Windows 4.0 / Data Access 4.0
    Si un post vous parait utile, n'oubliez pas de le marquer comme utile. S'il répond à votre question, n'oubliez pas de le marquer comme réponse.

    jeudi 2 février 2012 10:30
  • J'ai tester avec 0 et 1 , mais toujours la meme erreur. Je pense qu'il faut faire une colonneattribute , mais cet atttribut est complexe.

    Et le probleme est la version , je suis en version EF 4.1 et beaucoup de posts dans les forums sont obsoletes

    Merci  Anthride

    jeudi 2 février 2012 10:38
  • Je ne sais pas si tu l'as vu, mais dans mon extrait de code, tu as bien un ColumnAttribute. J'ai remplacé ton "dataMember" par "Column" 
    Sébastien Putier
    Consultant - Formateur technologies Microsoft
    Blog : http://sputier.wordpress.com
    MCTS Développement d'application Windows 4.0 / Data Access 4.0
    Si un post vous parait utile, n'oubliez pas de le marquer comme utile. S'il répond à votre question, n'oubliez pas de le marquer comme réponse.
    jeudi 2 février 2012 11:18
  • Alors, je viens de tester. Le code suivant fonctionne chez moi : 

     

    public class MonContext : DbContext
    {
        public DbSet<TpaBulletin> TpaBulletins { get; set; }
    }
    
    public class TpaBulletin
    {
        [Key, Column("Bul_MatPerId", Order = 0)]
        public int Bul_MatPerId { get; set; }
        [Key, Column("Bul_RubBullId", Order = 1)]
        public int Bul_RubBullId { get; set; }
    
        public int Bul_RubBull { get; set; }
    }


    Comme tu peux le voir, j'ai aussi précisé le nom de la colonne qui va bien dans le ColumnAttribute. Peux-tu me confirmer que cela fonctionne bien chez toi ?

    Cordialement,

    Sébastien


    Sébastien Putier
    Consultant - Formateur technologies Microsoft
    Blog : http://sputier.wordpress.com
    MCTS Développement d'application Windows 4.0 / Data Access 4.0
    Si un post vous parait utile, n'oubliez pas de le marquer comme utile. S'il répond à votre question, n'oubliez pas de le marquer comme réponse.
    • Marqué comme réponse Cdes jeudi 2 février 2012 13:24
    jeudi 2 février 2012 11:33
  • Ok cela fonctionne . je n'avais pas changer DataMember pat Column.

    Merci Anthride

     

    jeudi 2 février 2012 13:26