Angenommen, ich habe folgende Modellklassen in einem Entity Framework-Code-First-Setup:Aktualisierung getrennt Einheiten mit many-to-many-Beziehungen
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Team> Teams { get; set; }
}
public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> People { get; set; }
}
Die Datenbank von diesem Code erstellt wird, umfasst eine TeamPersons Tabelle, die die viele zu viele Beziehungen zwischen Menschen und Teams.
Angenommen, ich habe ein getrenntes Person-Objekt (kein Proxy und noch keinem Kontext zugeordnet), dessen Team-Sammlung ein oder mehrere getrennte Team-Objekte enthält, die alle Teams repräsentieren, die sich bereits in der Datenbank befinden. Ein Objekt wie durch die folgende geschaffen würde, nur zum Beispiel, wenn eine Person mit der ID 1 und ein Team mit Id 3 bereits in der db bestanden:
var person = new Person
{
Id = 1,
Name = "Bob",
Teams = new HashSet<Team>
{
new Team { Id = 3, Name = "C Team"}
}
};
Was ist der beste Weg, um diese Aufgabe zu aktualisieren, Damit nach dem Update die TeamPersons-Tabelle eine einzelne Zeile für Bob enthält, die ihn mit C Team verbindet? Ich habe die offensichtlich versucht:
using (var context = new TestContext())
{
context.Entry(person).State = EntityState.Modified;
context.SaveChanges();
}
aber die Teams Sammlung wird nur durch diese ignoriert. Ich habe auch verschiedene andere Dinge ausprobiert, aber nichts scheint genau das zu tun, wonach ich hier bin. Danke für jede Hilfe.
EDIT:
So bekomme ich, dass ich sowohl die Person und das Team holen konnte [s] aus der db, aktualisieren sie und dann Änderungen zu übernehmen:
using (var context = new TestContext())
{
var dbPerson = context.People.Find(person.Id);
dbPerson.Name = person.Name;
dbPerson.Teams.Clear();
foreach (var id in person.Teams.Select(x => x.Id))
{
var team = context.Teams.Find(id);
dbPerson.Teams.Add(team);
}
context.SaveChanges();
}
Dies ist ein Schmerz wenn Person eine komplizierte Entität ist. Ich weiß, dass ich Automapper oder etwas verwenden könnte, um die Dinge ein wenig einfacher zu machen, aber dennoch scheint es eine Schande, wenn es keine Möglichkeit gibt, das ursprüngliche Personenobjekt zu speichern, anstatt ein neues zu bekommen und alle Eigenschaften zu kopieren ...
kaufen selbst, das scheint nicht zu funktionieren: das Hinzufügen eines Teams geholt von der DB zu einer Person, die Ist kein Proxy, wird die TeamPersons-Tabelle nicht aktualisiert. Was bedeutet Arbeit holt das Team und die Person von der DB (also die Person ist ein Stellvertreter), aber dann müssen Sie diese geholte Person aktualisieren, um der Person zu entsprechen, die gespeichert wird ... – Duncan
Ah, Sie haben Recht (sollte habe besser gelesen). Nach Ihrer Bearbeitung können Sie 'DbContext.Entry (dbPerson) .CurrentValues.SetValues (person)' verwenden. –
Danke, das ist nützlich - ich wusste nichts über CurrentValues.SetValues – Duncan