1

次のようにマッピングされた 2 つのエンティティ ユーザーとロールがあります。

accountSet.HasMany(x => x.Roles).WithMany(x => x.Users).Map(t =>
      {
        t.ToTable("UserRole");
        t.MapLeftKey("UserId");
        t.MapRightKey("RoleId");
      });

ユーザーを更新しようとしています (新しい UserRole を追加して)

 var rolesForUser = UnitOfWork.UserRoleService.FindEntitiesByFilter(...);
user.Roles.Clear();

    foreach (var role in rolesForUser)
              user.Roles.Add(role)

使用中:

 AttachCollections(entity);
 _entityRepository.Update(entity);

アタッチコレクション:

private void AttachCollections(EntityBase entity)
    {
      var result = new List<IEnumerable<EntityBase>>();
      foreach (var prop in entity.GetType().GetProperties())
      {
        if (typeof(IEnumerable<EntityBase>).IsAssignableFrom(prop.PropertyType))
        {
          var get = prop.GetGetMethod();
          if (!get.IsStatic && get.GetParameters().Length == 0 && get.IsVirtual)
          {
            var enumerable = (IEnumerable<EntityBase>)get.Invoke(entity, null);
            if (enumerable != null) result.Add(enumerable);
          }
        }
      }
      foreach (var collection in result)
      {
          foreach (var r in collection)
          {

            var collectionType = r.GetType();/
            _dbContext.Set(collectionType).Attach(r);
          }
      }
    }


...UnitOfWork.Commit()

そして、「オブジェクトのキー値が ObjectStateManager の別のオブジェクトと競合しているため、AcceptChanges を続行できません。AcceptChanges を呼び出す前に、キー値が一意であることを確認してください。」というエラーが表示されました。

ApplyCollection を削除すると、id を持つ重複ユーザーを挿入できないというエラーが発生しました。UserRole が追加された状態としてマークされているようです。この状態を変更すると、ユーザー (ユーザー ロールに含まれる) も追加済みとしてマークされます。

4

0 に答える 0