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))
);
}
私は次のことを行います:
- 新しいグループを追加し、保存してリロードします
- ユーザーをグループに追加し、保存してリロードします
- 2 番目のユーザーを追加し、保存してリロードします
- 3 番目のユーザーを追加し、保存を試みます -> 例外がスローされます
デバッグ中、追加されるユーザー エンティティの状態は常にデタッチされ、新しいエンティティに対して と の両方が 0 に設定されますGroupId
。Id
追加された最初の 2 人のユーザーは正常に保存されます。ただし、3 番目のものでは、例外がスローされます。
いつも同じ方法で保存しているのに、うまくいかないのはなぜですか? それは問題ですEF
かGraphDiff
、この問題を解決する方法はありますか?
ここSOおよび他の場所でのほとんどの質問と関連する回答はすべて、子エンティティが削除されている状況を扱っています。これは、私の特定のシナリオには当てはまりません。