GraphDiffを使用して、分離されたオブジェクトグラフを更新しました。1つまたは複数の外部キープロパティが保存時にNULLを許可されないため、関係を変更できませんでした
モデルとマッピングは、次のとおりです。
挿入および更新のために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))
);
}
を私は次の操作を行います
- 追加新しいグループ、保存、再読み込み
- ユーザーをグループに追加して保存し直してください負荷
- 、第二のユーザを追加し、保存し、リロード
- 保存しようと、第3のユーザの追加 - >例外はデバッグなくなり
をスローされ、追加されたユーザエンティティの状態は常に取り外し、 GroupId
とId
の両方が新しいエンティティに対して0に設定されています。追加された最初の2人のユーザーは正常に保存されます。ただし、3番目の例外では、例外がスローされます。
私はいつも同じ方法で保存していますが、それはいつもうまくいかないのですか? EF
またはGraphDiff
の問題ですか?この問題を解決する方法はありますか?
ここでのほとんどの質問とその回答は、子エンティティが削除されている状況をすべて扱います。これは私の特定のシナリオでは当てはまりません。
'ToList()'を通常の 'foreach'に変更しても違いはありません。 –
「状態」が正しく追加されました。 –
「状態」が追加され、変更されていない場合、エンティティの切断に関する問題のように聞こえます。私の推測では、EFは 'GroupUser'を再作成して、保存しようとすると以前の 'GroupUser'をnullにしています。以前に追加したユーザーの値を印刷しましたか? – kermitvomit