2017-09-26 10 views
0

Mon code ci-dessous enregistre correctement l'enregistrement mais n'enregistre pas le client. Je ne reçois aucune erreur, il enregistre l'enregistrement dans DB, mais ne crée pas de relation avec le client parent. Pendant le débogage, j'ai vérifié que le client var contient effectivement un objet client.Entity Framework Code Le premier enregistrement de mise à jour n'économise pas le parent

Toute aide est très appréciée!

Quoi qu'il en soit voici mon code:

using (var context = new TDBContext()) 
     { 
      if (SelectedProject != null) 
      { 
       var client = (from x in context.Clients 
           where x.ID == (Guid) comboClient.SelectedValue 
           select x).FirstOrDefault(); 

       Project project = new Project() 
       { 
        ID = (Guid) SelectedProject, 
        ProjectCode = textProjectCode.Text, 
        Client = client, 
        ProjectStart = dateProjectStart.SelectedDate, 
        Active = checkActive.IsChecked 
       }; 

       context.Projects.Attach(project);  
       context.Entry(project).State = EntityState.Modified; 
       context.SaveChanges(); 
      } 
      else 
      { 
       MessageBox.Show("Project ID not loaded!", "Error!", MessageBoxButton.OK, MessageBoxImage.Error); 
      } 
     } 

L'entité du projet:

public Project() 
    { 

    } 

    [Key] 
    public Guid ID { get; set; }  
    public string ProjectCode { get; set; } 
    public Client Client { get; set; } 
    public DateTime? ProjectStart { get; set; } 
    public bool? Active { get; set; } 

L'entité cliente:

public Client() 
    { 

    } 
    [Key] 
    public Guid ID { get; set; } 
    public string ClientName { get; set; } 
    public byte[] ClientLogo { get; set; } 

    public ICollection<Project> Projects { get; set; } 
+0

Sorte de manière géniale de le faire (je chercherais le client et mettrais à jour sa collection enfant), mais cela fonctionnerait probablement si vous définissiez aussi l'état d'entité de Project.Client à modifier aussi. De plus, je préfère 'First()' 'FirstOrDefault()' quand je compte sur l'existence de l'enregistrement parent. Je voudrais au moins m'assurer que ce n'est pas nul. –

Répondre

0

Edit (finalement obtenu de travail):

J'ai créé une méthode distincte pour mettre à jour le client. J'appelle cela de ma méthode d'enregistrement principale. Cela fonctionne à chaque fois maintenant. Je suis sûr que je peux le faire mieux (à savoir tous dans la même méthode):

private void SaveClient() 
    { 
     using (var context = new PDBContext()) 
     { 
      var client = (from x in context.Clients 
          where x.ID == (Guid) comboClient.SelectedValue 
          select x).FirstOrDefault(); 

      var project = (from x in context.Projects 
          where x.ID == SelectedProject 
          select x).FirstOrDefault(); 

      project.Client = client; 

      context.Projects.Attach(project); 

      context.Entry(project).State = EntityState.Modified; 

      context.SaveChanges(); 
     } 

     PopulateClientCombo(); 
    } 
0

Vous devez assigner la colonne ClientId pas seulement la référence du client. EF est assez intelligent pour vérifier quand le ClientId existe et a un ID différent de celui de la propriété de navigation client, mais si l'ID est vide, il ignorera complètement cette propriété de navigation Client.

Modifier

Ah, puis appelez context.Projects.Add (projet) au lieu de changer Modified.

+0

Essayé Client.ID = client.ID mais cela ne fonctionne pas. Je reçois "Invalid initializer member déclarator".Quelle est la bonne façon de faire cela? – Salbrox

+0

la propriété id client sur l'entité de projet elle-même. c'est-à-dire project.ClientId = client.Id. –

+0

Je n'ai pas de propriété d'identification de client J'ai un client qui est l'entité parent de Project. Ils sont dans une relation 1-n. – Salbrox

0

Je ne suis pas sûr de votre utilisation de EF mais je vais essayer de donner un coup de feu pour ce problème. S'il vous plaît noter que c'est une approche tout à fait différente de la vôtre. En bref, je vais créer/récupérer l'identifiant du client et l'ajouter dans le nouvel objet de projet qui est ajouté.

  1. Ajouter une propriété supplémentaire à votre entité de projet: public Guid ClientId { get; set; }. Cela se trouve à côté de public Client Client { get; set; }. Lorsque vous appliquez des migrations, votre table Projet a désormais ClientId pour référencer le client (relation 1-à-plusieurs, n'est-ce pas?)

  2. Appliquez les migrations et assurez-vous que les tables elles-mêmes contiennent les références.

  3. Dans votre méthode, ajoutez ClientId lorsque vous créez de nouveaux projets. Cela devrait suffire.

    Project project = new Project() 
    { 
        ID = (Guid) SelectedProject, 
        ProjectCode = textProjectCode.Text, 
        ClientId = (Guid)comboClient.SelectedValue, // Your client's Guid. Make sure this record exists in the database. 
        ProjectStart = dateProjectStart.SelectedDate, 
        Active = checkActive.IsChecked 
    }; 
    

C'est ce que je fais habituellement avec mes projets. Lorsque vous requête, vous chargez les données et EntityFramework a des méthodes pour le faire pour vous. Voir aussi: Loading Related Data