Verwenden Sie diesen Ansatz:
public class Company
{
public int Id { get; set; }
public string Name { get; set;}
private ICollection<User> _users;
public ICollection<User> Users
{
get
{
return _users ?? (_users = new HashSet<User>());
}
set
{
_users = value;
}
}
}
HashSet
ist besser als andere Sammlungen, wenn Sie auch die Equals
y GetHashCode
in Ihren Einrichtungen. Es wird Duplikate für Sie behandeln. Auch die träge Initialisierung von Sammlungen ist besser. Ich erinnere mich nicht mehr genau, aber ich glaube, ich hatte einige Probleme in einer meiner ersten EF-Testanwendungen, als ich die Sammlung im Konstruktor initialisierte und außerdem dynamische Proxies für träges Laden und Änderungsverfolgung verwendete.
Es gibt zwei Arten von Entitäten: losgelöste und angehängte. Eine angehängte Entität wird bereits durch den Kontext verfolgt. Normalerweise erhält man die angehängte Entität durch eine Linq-to-Entities-Abfrage oder durch den Aufruf von Create
en DbSet
. Eine abgetrennte Einheit wird nicht durch den Kontext verfolgt, aber sobald Sie die Attach
o Add
bei der Einstellung, diese Entität anzuhängen, werden alle damit verbundenen Entitäten ebenfalls angehängt / hinzugefügt. Das einzige Problem, mit dem Sie bei der Arbeit mit abgetrennten Entitäten konfrontiert werden, ist, wenn die verwandte Entität bereits in der Datenbank vorhanden ist und Sie nur eine neue Beziehung erstellen möchten.
Die wichtigste Regel, die Sie verstehen müssen, ist der Unterschied zwischen den Methoden Add und Attach:
Add
wird alle abgetrennten Entitäten im Graphen als Added
=> Alle zugehörigen Entitäten werden als neue Entitäten eingefügt.
Attach
wird alle abgetrennten Entitäten im Graphen als Unchanged
=> Sie müssen manuell angeben, was geändert wurde.
Sie können den Status jeder angehängten Entität manuell einstellen, indem Sie
context.Entry<TEntity>(entity).State = EntityState....;
Bei der Arbeit mit abgetrennten Many-to-Many-Elementen müssen Sie in der Regel diese Techniken verwenden, um nur Beziehungen aufzubauen, anstatt doppelte Elemente in die Datenbank einzufügen.
Meiner Erfahrung nach ist es sehr schwierig, mit abgetrennten Entitätsgraphen zu arbeiten, vor allem nach dem Löschen von Beziehungen. Deshalb lade ich immer Entitätsgraphen aus der Datenbank und führe Änderungen manuell in die angehängten Graphen ein, die in der Lage sind, alle Änderungen für mich vollständig nachzuvollziehen.
Beachten Sie, dass Sie Entitäten aus verschiedenen Kontexten nicht mischen können. Wenn Sie eine Entität aus einem Kontext in einen anderen einbinden wollen, müssen Sie die Entität zuerst explizit aus dem ersten Kontext lösen. Ich hoffe, Sie können das tun, indem Sie den Status auf Detached
im ersten Kontext.