ich GraphDiff nicht zum Nullwerten verwenden können, um detached Objektdiagramme zu aktualisieren, und ich bekomme die obige Ausnahme beim Speichern eines übergeordneten Objekts und seiner untergeordneten Elemente.Die Beziehung konnte nicht geändert werden, weil eine oder mehrere Eigenschaften des Fremdschlüssels beim Speichern
Die Modelle und Mapping sind:
public class Group
{
public int Id { get; set; }
public virtual ICollection<GroupUser> Users{ get; set; }
}
public class GroupUser
{
public int Id { get; set; }
public int GroupId { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
}
public class GroupMap : EntityTypeConfiguration<Group>
{
public GroupMap()
{
this.ToTable("groups");
this.HasKey(t => t.Id).Property(t => t.Id).HasColumnName("id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.HasMany(t => t.Users)
.WithOptional()
.HasForeignKey(d => d.GroupId)
.WillCascadeOnDelete();
}
}
public class GroupUserMap : EntityTypeConfiguration<GroupUser>
{
public GroupUserMap()
{
this.ToTable("groups_users");
this.HasKey(t => t.Id).Property(t => t.Id).HasColumnName("id").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Property(t => t.GroupId).HasColumnName("group_id").IsRequired();
this.Property(t => t.UserId).HasColumnName("user_id").IsRequired();
this.HasRequired(t => t.User)
.WithMany()
.HasForeignKey(d => d.UserId)
.WillCascadeOnDelete(false);
}
}
Für Einsätze und Updates ich das folgende Verfahren in meinem Repository:
public override Group Update(Group entity)
{
if (entity.Users != null)
{
entity.Users.ToList()
.ForEach(x =>
{
x.GroupId = x.Id == 0 ? 0 : entity.Id;
x.UserId = x.User.Id;
});
}
return dbContext.UpdateGraph<Group>
(entity,
map => map.OwnedCollection(x => x.Users, with => with.AssociatedEntity(c => c.Users))
);
}
ich folgendes:
- ein In neue Gruppe, speichern und neu laden
- Hinzufügen eines Benutzers zu der Gruppe, speichern und erneut Last
- einen zweiten Benutzer hinzufügen, speichern und
- hinzufügen dritten Benutzer neu zu laden, versuchen zu retten -> Ausnahme Während das Debuggen
geworfen wird, der Zustand der Benutzerentitäten immer gelöst wird hinzugefügt, und Sowohl GroupId
als auch Id
werden für neue Entitäten auf 0 gesetzt. Die ersten 2 hinzugefügten Benutzer werden erfolgreich gespeichert. Bei der dritten wird jedoch die Ausnahme ausgelöst.
Wenn ich immer die gleiche Methode zum Speichern verwende, warum funktioniert es nicht immer? Ist es ein EF
oder GraphDiff
Problem und gibt es eine Möglichkeit, dieses Problem zu lösen?
Die meisten Fragen und zugehörigen Antworten hier auf SO und anderswo befassen sich alle mit der Situation, in der eine untergeordnete Entität gelöscht wird. Dies ist in meinem speziellen Szenario nicht der Fall.
Das Ändern von 'ToList()' zu einer normalen 'foreach' machte keinen Unterschied. –
'State' ist hinzugefügt was korrekt ist. –
Wenn der 'Status' hinzugefügt und nicht unverändert ist, klingt es wie ein Problem mit einer Trennung von Entitäten. Meine Vermutung ist, dass EF den 'GroupUser' neu erstellt und dann den vorherigen 'GroupUser' beim Speichern löscht. Haben Sie versucht, die Werte der zuvor hinzugefügten Benutzer zu drucken? – kermitvomit