Entity Framework - mise à Jour par l'évolution de la relation de clé étrangère
J'ai les deux modèles suivants et DbContext:
public class TestDbContext : DbContext
{
public IDbSet<Person> People { get; set; }
public IDbSet<Car> Cars { get; set; }
}
public class Person
{
public Person()
{
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string Name { get; set; }
public virtual List<Car> Cars { get; set; }
}
public class Car
{
public Car()
{
ID = Guid.NewGuid();
}
public Guid ID { get; set; }
public string Name { get; set; }
public virtual Person Owner { get; set; }
}
Je puis déclarer une liste de personnes et la liste des voitures, la définition de la propriétaire de la première voiture à la première personne dans la liste:
List<Person> People = new List<Person>()
{
new Person() {Name = "bill", ID = new Guid("6F39CC2B-1A09-4E27-B803-1304AFDB23E3")},
new Person() {Name = "ben", ID = new Guid("3EAE0303-39D9-4FD9-AF39-EC6DC73F630B")}
};
List<Car> Cars = new List<Car>() { new Car() { Name = "Ford", Owner = People[0], ID = new Guid("625FAB6B-1D56-4F57-8C98-F9346F1BBBE4") } };
Je la garde hors de la base de données en utilisant le code suivant et cela fonctionne bien.
using (TestDbContext context = new TestDbContext())
{
foreach (Person person in People)
{
if (!(context.People.Any(p => p.ID == person.ID)))
context.People.Add(person);
else
{
context.People.Attach(person);
context.Entry<Person>(person).State = System.Data.EntityState.Modified;
}
}
foreach (Car caar in Cars)
{
if (!(context.Cars.Any(c => c.ID == caar.ID)))
context.Cars.Add(caar);
else
{
context.Cars.Attach(caar);
context.Entry<Car>(caar).State = System.Data.EntityState.Modified;
}
}
context.SaveChanges();
}
Si je puis changer le propriétaire de la voiture pour la deuxième personne et exécutez à nouveau le code, le propriétaire de la Voiture de la propriété n'est pas mis à jour.
Cars[0].Owner = People[1];
Toutes les idées de ce que je fais mal? Merci pour toute aide.
Juste pour ajouter, je suis en train de réaliser ce qui est suggéré stackoverflow.com/questions/9382005/...
Comment avez-vous sauver? Où est le code pour cela? Vous devez recharger
Comment avez-vous sauver? Où est le code pour cela? Vous devez recharger
Cars
de DB et ensuite de le refaire .
OriginalL'auteur user2697817 | 2013-08-19
Vous devez vous connecter pour publier un commentaire.
Je crois que c'est un problème de indépendant vs clé étrangère de l'association. Vous utilisez association indépendante pour le moment, et la relation entre la voiture et la personne est en fait géré par une entrée séparée de l'objet qui a sa propre état (pour accéder à cet objet, vous devez utiliser l'API ObjectContext). La configuration de la voiture de l'entité d'entrée de modification de l'état ne change pas l'état de l'entrée de la relation! La solution la plus simple est d'utiliser des clés de l'association au lieu de cela qui signifie que l'ajout de nouveaux
Guid PersonId
de propriété de la voiture et la carte comme propriété de clé étrangère pourPerson
propriété de navigation.Si vous insistez sur l'utilisation des associations indépendantes, vous devez modifier les relations que sur joint entités sinon, vous aurez eu un fort mal de tête avec le suivi de ces changements et de la configuration de toutes les entrées nécessaires avec un bon état. Il devrait être suffisant pour créer des objets, de les attacher à un contexte et seulement après que définir le propriétaire de la voiture - j'espère qu'il va être suivi comme un changement.
Oui il devrait être le même.
Juste à côté de la note: j'ai vraiment du respect pour vous et vous remercions de votre contribution ici pour de nombreux de EF questions... pourriez-vous s'il vous plaît vérifier ma question? stackoverflow.com/questions/18529338/...
OriginalL'auteur Ladislav Mrnka
Essayer quelque chose comme cela :
Je pense que ton erreur est due à l'
context.SaveChanges
stages (et partiellement votre architecture). Envisagez l'utilisation d'une méthode dédiée (un CRUD de base par exemple) pour chaque opération sur votre base de données via Entity Framework. Espérons que cette aide.Edit : Avec un CRUD approche :
Vous pouvez aussi faire cette classe
static
afin de s'adapter à votre architecture.Avez-vous juste de copier/coller ? Ou avez-vous créé une base de CRUD ? Parce qu'avec un CRUD approche vous ne devriez pas avoir des erreurs...
J'ai essayé ce que vous avez suggéré, il n'a pas de travail. Peut-être vous avez besoin d'être plus clair. 🙂
Avez-vous même la recherche de ce qu'un CRUD est...? Eh bien, je viens de mettre à jour ma réponse, s'il vous plaît aller vérifier de nouveau.
Qui a dit que je ne sais pas ce qu'est un CRUD est? Avez-vous lu la réponse que j'ai lié? Merci pour toute aide.
OriginalL'auteur Atlasmaybe