IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entity Framework Discussion :

Synchronisation propriete navigation entity framework [Débutant]


Sujet :

Entity Framework

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 13
    Points : 12
    Points
    12
    Par défaut Synchronisation propriete navigation entity framework
    Bonjour,

    Concernant le contexte, je développe une appli WPF en VB.net avec EF 6.2.0.

    J'essaie de mettre à jour une clé étrangère via une combobox, mais lorsque je fais SaveChanges, j'obtiens une erreur "A referential integrity constraint violation occurred: The property value(s) of 'RefTypeCompetition.RefTypeCompetitionId' on one end of a relationship do not match the property value(s) of 'Competition.TypeCompetitionId' on the other end".

    Quand je debug, je vois que competition.TypeCompetitionId a bien la valeur que je viens de définir, mais je vois aussi que la propriété de navigation n'est pas en adéquation avec le TypeCompetitionId.

    Pour charger les données je procède comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Using ctx As New myContext
                For Each competition As Competition In ctx.Competitions.Include("TypeCompetition").OrderByDescending(Function(f) f.DateDebut)
                    LastCompetitions.Add(competition)
                Next
            End Using
    Ensuite, pour la mise à jour de ma clé étrangère j'utilise une combobox décrite comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <ComboBox ItemsSource="{Binding TypesCompetition}" HorizontalAlignment="left"  Width="350" HorizontalContentAlignment="left" DisplayMemberPath="Libelle" SelectedValuePath="RefTypeCompetitionId" SelectedValue="{Binding Competition.TypeCompetitionId, Mode=TwoWay,
                            UpdateSourceTrigger=PropertyChanged}" />
    Puis pour sauvegarder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Private Sub OnSaveCompetitionCommand()
            Using ctx As New MyContext
                'on attache la compet existante au contexte
                ctx.Competitions.Attach(_Competition)
                ctx.Entry(_Competition).State = Entity.EntityState.Modified
                ctx.SaveChanges()
            End Using
        End Sub
    Ma classe compétition se prséente comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Class Competition
        Inherits ObservableObject
     
        Public Property CmpGuid As Guid
     
        Private _Nom As String
        Public Property Nom As String
            Get
                Return _Nom
            End Get
            Set(value As String)
                _Nom = value
                OnPropertyChanged(NameOf(Nom))
            End Set
        End Property
     
        Public Property TypeCompetitionId As Integer
     
        Private _TypeCompetition As RefTypeCompetition
        Public Property TypeCompetition As RefTypeCompetition
            Get
                Return _TypeCompetition
            End Get
            Set(value As RefTypeCompetition)
                _TypeCompetition = value
                OnPropertyChanged(NameOf(TypeCompetition))
            End Set
        End Property
     
    End Class
    Et la classe RefTypeCompetition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class RefTypeCompetition
     
        Public Property RefTypeCompetitionId As Integer
     
        Public Property Libelle As String
     
        Public Property TypeEpreuve As TypeEpreuve
     
     
        Public Property Competitions As ObservableCollection(Of Competition)
     
    End Class
    Au cas où, je mets aussi mon context :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Public Class MyContext
        Inherits DbContext
     
    #Region "DBSets"
        Public Property Competitions As DbSet(Of Competition)
     
    #Region "Référentiels"
        Public Property RefTypesCompetitions As DbSet(Of RefTypeCompetition)
    #End Region
     
    #End Region
     
     
        Public Sub New()
            MyBase.New("myConnection")
            Database.SetInitializer(New MigrateDatabaseToLatestVersion(Of MyContext, Models.Migrations.Configuration))
        End Sub
     
        Protected Overrides Sub OnModelCreating(modelBuilder As DbModelBuilder)
            MyBase.OnModelCreating(modelBuilder)
            modelBuilder.Conventions.Remove(Of PluralizingTableNameConvention)()
     
            ' ******************************************************** référentiels **************************************************************************
     
            With modelBuilder.Entity(Of RefTypeCompetition)
                .HasKey(Function(c) c.RefTypeCompetitionId)
                .Property(Function(c) c.RefTypeCompetitionId).HasDatabaseGeneratedOption(ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)
                .HasMany(Function(f) f.Competitions).WithRequired(Function(f) f.TypeCompetition).HasForeignKey(Function(f) f.TypeCompetitionId)
            End With
            ' ************************************************************************************************************************************************
     
     
            With modelBuilder.Entity(Of Competition)
                .HasKey(Function(c) c.CmpGuid)
                .Property(Function(c) c.CmpGuid).HasDatabaseGeneratedOption(ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)
                .HasMany(Function(f) f.Epreuves).WithRequired(Function(f) f.Competition).WillCascadeOnDelete()
                '.HasRequired(Function(f) f.TypeCompetition).WithMany(Function(f) f.Competitions).HasForeignKey(Function(f) f.TypeCompetitionId)
            End With        
     
        End Sub
     
    End Class
    J'ai remarque que dans ma Sauvegarde, si je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            Using ctx As New MyContext
                'on attache la compet existante au contexte
                ctx.Competitions.Attach(_Competition)
                _Competition.TypeCompetitionId = 1
                ctx.Entry(_Competition).State = Entity.EntityState.Modified
                ctx.SaveChanges()
            End Using
    Là tout fonctionne ... mais ce n'est pas ce que je veux, puisque dans ce cas, je met la valeur en dur.
    Je dois surement faire un truc de travers, mais je ne vois pas quoi.

    Merci d'avance.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2016
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    Bon, je pense que j'ai trouvé la solution.

    Il s'agit en fait d'un problème lié au cycle de vie de mon contexte.

    J'initalise le context à l'ouverture de mon user control, puis je le dispose lorsque j'en ai fini avec lui.

    Ci-dessous un lien concernant la durée de vie du datacontext.
    https://www.developpez.net/forums/d1...e-d-dbcontext/

    Merci à celles et ceux qui auront pris le temps de me lire.
    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Synchronisation entity framework
    Par Pelote2012 dans le forum Entity Framework
    Réponses: 6
    Dernier message: 19/08/2011, 09h09
  2. version final d'Entity framework
    Par korchimustapha dans le forum Général Dotnet
    Réponses: 8
    Dernier message: 04/07/2008, 17h21
  3. [ADO.NET Entity Framework] génération des tables
    Par anthyme dans le forum Accès aux données
    Réponses: 3
    Dernier message: 22/02/2008, 17h44
  4. Linq - Entity Framework
    Par Jfrancois57 dans le forum Framework .NET
    Réponses: 11
    Dernier message: 12/02/2008, 08h06
  5. [EJB3 Entity] Synchronisation des CMP entity bean 3.0 avec la BD
    Par st0ne dans le forum Java EE
    Réponses: 9
    Dernier message: 13/11/2006, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo