0

メソッドを使用して、ユーザーロールのリストをあるユーザーから別のユーザーにコピーしようとしています:

public bool CopyUsersRoles(Guid copyFromUserId, Guid copyToUserId)
{
    //Delete existing roles for user
    var rolesToDelete = context.UserApplicationRoles.Where(x => x.UserID == copyToUserId);

    foreach (var u in rolesToDelete)
    {
        context.UserApplicationRoles.DeleteObject(u);
    }    

    var rolesToAdd = context.UserApplicationRoles.Where(x => x.UserID == copyFromUserId)
                                  .ToList();                             

    for(int i = 0; i < rolesToAdd.Count; i++)
    {
        rolesToAdd[i].UserID = copyToUserId;                           
    }    

    foreach (var u in rolesToAdd)
    {
        context.UserApplicationRoles.AddObject(u);
    }    

    context.SaveChanges();    
}

新しい を割り当てると、次の例外が発生しますUserId

プロパティ「UserID」はオブジェクトのキー情報の一部であり、変更できません。System.Data.Objects.EntityEntry.VerifyEntityValueIsEditable (StateManagerTypeMetadata typeMetadata、Int32 序数、文字列 memberName) で

ToList() がこれを防いでいると思っていたでしょう...

これを達成する正しい方法は何ですか?

編集 - クラスの詳細:

ここに画像の説明を入力

レガシー テーブルに PK が設定されていないことがわかります。PK を UserApplicationRoleId に手動で設定すると、これが修正されると想定しています。

UserId 次のようになります。

    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Guid UserID
    {
        get
        {
            return _UserID;
        }
        set
        {
            if (_UserID != value)
            {
                OnUserIDChanging(value);
                ReportPropertyChanging("UserID");
                _UserID = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("UserID");
                OnUserIDChanged();
            }
        }
    }
4

2 に答える 2

0

これをかなり厄介な方法で機能させることになりました(レガシーDBには自動インクリメントPKがありません:(

            var copyToUser = this.GetUser(copyToUserId);
            List<UserApplicationRole> userApplicationRoles = new List<UserApplicationRole>();
            int startingId = Convert.ToInt32(isignonContext.UserApplicationRoles.OrderByDescending(u => u.UserApplicationRoleId).FirstOrDefault().UserApplicationRoleId) + 1;

            foreach (var u in userApplicationRolesToAdd)
            {
                UserApplicationRole userApplicationRole = new UserApplicationRole
                {
                    UserApplicationRoleId = startingId,
                    UserID = copyToUser.UserId,
                    UserGroupId = copyToUser.ParentId.Value,
                    ApplicationRoleId = u.ApplicationRoleId,
                    ExpiryDate = u.ExpiryDate,
                    IsEnabled = u.IsEnabled
                };

                userApplicationRoles.Add(userApplicationRole);
                startingId++;
            }     
于 2012-09-20T07:49:47.967 に答える
0

これが問題です:

  var rolesToAdd = context.UserApplicationRoles
  .Where(x => x.UserID == copyFromUserId)                             
  .ToList();  

   ....

  foreach (var u in rolesToAdd)
  {
    context.UserApplicationRoles.AddObject(u);
  } 

DB/EF に既にあるオブジェクトを参照しています。これらのクローンを作成し、クローンを EF に追加する必要があります。

于 2012-09-20T07:18:21.003 に答える