Използвам GraphDiff за актуализиране на графики на отделен обект и получавам горното изключение, когато запазвам родител и неговия деца.
Моделите и картографирането са:
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);
}
}
За вмъквания и актуализации имам следния метод в моето хранилище:
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))
);
}
Правя следното:
- Добавете нова група, запазете и презаредете
- Добавете потребител към групата, запазете и презаредете
- Добавете втори потребител, запазете и презаредете
- Добавете трети потребител, опитайте да запазите -> изключение е хвърлено
Докато се отстраняват грешки, състоянието на добавените потребителски обекти винаги се отделя и GroupId
и Id
са зададени на 0 за нови обекти. Първите 2 добавени потребители са запазени успешно. Въпреки това, на третия, изключението е хвърлено.
Ако винаги използвам един и същ метод за запазване, защо не работи винаги? Дали това е EF
или GraphDiff
проблем и има ли начин да се реши този проблем?
Повечето въпроси и свързаните с тях отговори тук на SO и другаде се занимават със ситуацията, при която дъщерен обект се изтрива. Това не е така в моя конкретен сценарий.