メソッドを使用して、ユーザーロールのリストをあるユーザーから別のユーザーにコピーしようとしています:
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();
}
}
}