Entity Framework - Update-Beziehung, indem Sie Fremdschlüssel
Habe ich die beiden folgenden Modelle und 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; }
}
Ich dann deklarieren Sie eine Liste von Menschen und eine Liste der Autos, die Einstellung der Besitzer das erste Auto, die erste person in der 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") } };
Ich diese aus der Datenbank mit dem folgenden code und dieser funktioniert einwandfrei.
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();
}
Wenn ich dann ändern Sie den Besitzer des Autos, um die zweite person und den code erneut ausführen, wird das Auto owner-Eigenschaft nicht aktualisiert.
Cars[0].Owner = People[1];
Irgendwelche Ideen, was ich falsch mache? Vielen Dank für jede Hilfe.
- Nur um, ich bin versucht zu erreichen, was vorgeschlagen wird, stackoverflow.com/questions/9382005/...
- Wie haben Sie es speichern? Wo ist der code dafür? Sie brauchen, um neu zu laden
Cars
von der DB und dann die Zuordnung .
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, das ist ein problem der unabhängige vs foreign key-association. Sie sind mit eigenständiger Verein im moment und die Beziehung zwischen Auto und Mensch ist es tatsächlich schaffte, durch einen separaten Eintrag Objekt hat seinen eigenen Zustand (der Zugriff auf dieses Objekt müssen Sie ObjectContext-API). Einstellung der Auto-entity Eintrag zu geänderten Zustand wird sich nicht ändern der Staat der Einreise für die Beziehung! Die einfache Lösung ist die Verwendung von foreign key-association statt, was bedeutet, das hinzufügen neuer
Guid PersonId
Eigentum an Ihrem Auto, und ordnen Sie Sie als foreign-key-Eigenschaft fürPerson
navigation Eigenschaft.Wenn Sie darauf bestehen, mit unabhängigen Verbänden sollten Sie Beziehungen nur auf dem angeschlossenen Einheiten sonst werden Sie hatte starke Kopfschmerzen, die mit der Verfolgung dieser änderungen und alle erforderlichen Einträge mit korrekten Zustand. Es sollte genug sein, um Objekte zu erstellen, fügen Sie Sie zu Rahmen und nur nach, dass den Besitzer das Auto - ich hoffe, es wird verfolgt, da eine Veränderung.
Probieren Sie etwas wie dieses :
Ich denke, dein Fehler ist aufgrund der
context.SaveChanges
Platzierungen (und wenigstens teilweise Ihre Architektur aus). Erwägen Sie die Verwendung einer dedizierten Methode (eine grundlegende CRUD-für Beispiel) für jede operation auf einer DB via Entity Framework. Hoffe, das hilft.Edit : Mit einer CRUD-Ansatz weiter :
Könnte man auch machen, diese Klasse
static
in Reihenfolge zu fit Ihre Architektur.