2010-07-14 28 views
1

en travaillant avec Entity Framework, SQL et C#.C# - Entity Framework ajoute un nouvel objet à ObjectContext

J'ai une table appelée Client et autre appelée clients_phone.

J'ai un formulaire avec un Xtragrid et en utilisant BindingSource je lie l'IQueryable à la grille.

myBindingSource = new BindingSource(); 
myBindingSource.DataSource = clients; //Clients it is the IQueryable<Client> 
myBindingSource.DataMember = "clients_phone"; 
myBindingSource.AllowNew = true; 

Ensuite, je souhaite ajouter un nouveau clients_phone à mon client. Pour ce faire, je crée un nouveau client(), puis j'ajoute le téléphone.

clients newclient = objContext.CreateObject<clients>(); 

newclient.clients_phone = newClients_Phone; 

objContext.AddObject("Clients", newclient); 

Enfin j'ajouter le nouveau clients_phone dans le ObjectContext, mais quand je vois le clients_phone Xtrag ne montrent pas.

Une idée de ce qui se passe ??.

Merci

+0

Êtes-vous rafraîchir le BindingSource? Il n'existe aucune méthode permettant au contexte d'objet de notifier BindingSource que les données sous-jacentes ont été modifiées. Vous devrez donc l'actualiser manuellement. – CodingGorilla

+0

Comment faire cela? Comment rafraîchir le BindingSource? –

+0

Je répète simplement le code de liaison, il est possible de refactoriser votre code dans une méthode et ensuite vous pouvez simplement l'appeler à nouveau après avoir effectué vos modifications. – CodingGorilla

Répondre

1

Avez-vous essayé d'enregistrer et de valider l'objet?

objContext.SaveChanges(true); 

objContext.AcceptAllChanges(); 
+0

Non, parce que je dois ajouter beaucoup de Clients_Phone à un client. Donc, je ne peux pas changer avant que tout ne soit ajouté. –

+2

Peut-être qu'il me manque quelque chose, si vous n'êtes pas en train d'enregistrer les modifications dans la base de données, comment vous attendez-vous à le voir dans une grille liée à une requête de base de données? – CodingGorilla

2

Lucas B a raison. Chaque fois que vous avez arrondi à l'ajout de tous les nouveaux clients et Clients_phone, vous devez appeler la méthode SaveChanges() afin de conserver les données dans la base de données.

Si vous devez d'abord créer le client, puis effectuer une mise à jour pour ajouter d'autres entrées client_phone ou autres. Si vous n'appelez jamais la méthode SaveChanges(), rien de ce que vous faites ne sera sauvegardé dans la base de données.

0

J'ai fait le SaveChanges() mais je le vois comme une solution de contournement.

Inconvénient de ceci: Lorsque l'utilisateur annule l'action, le nouvel objet sera dans le DB.

utilisation: « Créer une personne »

  1. utilisateur de sélectionner un élément de menu (ou bouton ou autre) nommé « Créer personne » (et le nouvel utilisateur doit apparaître dans un contrôle GridView par exemple - SaveChanges() est appelé)
  2. le l'utilisateur remplit Prénom, nom, etc.
  3. Mais les utilisateurs découvre qu'il n'a pas besoin de créer cette personne (par exemple, l'utilisateur se souvient qu'il a créé cette personne déjà hier)
  4. L'utilisateur n'appuie pas sur le bouton Enregistrer (élément de menu ou peu importe ;-)) il utilise l'élément de menu "Annuler" (ou un bouton ou autre) - et donc il y aura une personne orpheline dans le DB

Autre approche: Pour ajouter la nouvelle personne (non engagée encore) à un contrôle GridView vous pouvez définir le DataSource aux "personnes courant + nouvelle personne"

private object GetBindingList(ObjectSet<Person> contextObjects, Person newObject) 
{ 
    List<Person> list = new List<Person>(); 

    list.AddRange(contextObjects); 
    list.Add(newObject); 

    return list; 
} 

utilisation:

PersonsBindingSource.DataSource = GetBindingList(Context.PersonSet, newPerson); 

Mais cela a un inconvénient: Il ne fonctionne que la première fois .. .Vous devez donc quelque chose comme:

PersonsBindingSource.DataSource = GetBindingList(Context.PersonSet, newPerson); 
Context.PersonSet = Populate with persons from PersonsBindingSource.DataSource // ;-) 

Mais pourquoi est-contextObjects.AddObject (newObject); ne fonctionne pas (le nouvel article ne sera pas affiché dans le GridView - le problème se produit uniquement pour les objets sans clés étrangères à d'autres objets)

fonctionne que lorsque vous appelez SaveChanges():

PersonsBindingSource.DataSource = Context.PersonSet.Execute(MergeOption.AppendOnly);