最初に EF コードでエンティティを更新しようとしています。
ボタンがクリックされたときにこのコードを実行します
bool result
if (hasPrivilege == true)result = userManager.RemoveUserPrivilege(Username, privilege, out errors);
else result = userManager.GiveUserPrivilege(Username, privilege, out errors);
次に、メソッドが成功したかどうかを確認し、新しい値が表示されるように権限のリストを更新します。
if (result == false) txtBlkErrorMessages.Text = string.Join("\n", errors);
else
{
privilegeCache = privileges.GetAll(int.MaxValue).Where(prv => prv.Username == Username).OrderBy(prv => prv.PrivilegeName).ToList();
DisplayInDataGid();
}
問題は、最初の部分でデータベースが正常に更新されることです (ブレークポイントを設定し、データベースに対してクエリを実行しました。ただし、2 番目の部分では以前の値が取得されます。
たとえば、真の特権を選択してボタンをクリックすると、特権が削除され、すぐにその特権が偽であることが示されますが、単に真であることが示されます。
ウィンドウを閉じてからもう一度開くと、新しい値が表示されます。
privilgeCache オブジェクトを null に設定してから、特権を取得しようとしました。喜びはありません。
このためのエンティティ クラスは次のとおりです。
public sealed class UserPrivilege { /// <summary> /// PRIMARY KEY -> THE NAME OF THE USER /// MUST BE BETWEEN 5 and 30 CHARACTERS AND IS A REQUIRED FIELD /// </summary> [Key, Column(Order = 0), Required, StringLength(30, MinimumLength = 5), Display(Name = "Username")] public string Username { get; set; } /// <summary> /// PRIMARY KEY -> THE NAME OF THE PRIVILEGE /// MUST BE BETWEEN 5 and 30 CHARACTERS AND IS A REQUIRED FIELD /// </summary> [Key, Column(Order = 1), Required, StringLength(30, MinimumLength = 5), Display(Name = "Privilege Name")] public string PrivilegeName { get; set; } /// <summary> /// WHETHER THE USERNAME HOLDS THE PRIVILEGE OR NOT /// </summary> [Required, Display(Name = "Holds Privilege")] public bool HoldsPrivilege { get; set; }
}
データベースを更新するコードは次のとおりです。
try
{
userPrivilegeRepository.UpdateUserPrivilege(username, privilege, hasPrivilege);
logger.WriteLog(LogTitle.UserPrivilegeUpdated, LogLevels.Information, LogData);
return true;
}
catch (Exception ex)
{
errors.Add(string.Format(ErrorMessages.ErrorOccured, "Updating a user privilege"));
logger.WriteLog(LogTitle.ExceptionThrown, LogLevels.Critical, LogData, ex);
return false;
}
最後に、更新メソッドのリポジトリ コードは次のとおりです。
public bool UpdateUserPrivilege(string username, string privilege, bool hasPrivilege)
{
//GET THE ACCOUNT
UserPrivilege acct = GetByKeys(new string[] { username, privilege });
//IF AN ACCOUNT WAS FOUND
if (acct != null)
{
//UPDATE THE FIELDS
acct.HoldsPrivilege = hasPrivilege;
}
bool success = (Database.SaveChanges() > 0);
//SAVE THE CHANGES
return success;
}
私はそれが次の2つのいずれかであると感じています:
- EF は値をどこかにキャッシュしています。キャッシュをクリアするにはどうすればよいですか?
- 少し前に、エンティティのキーがめちゃくちゃになる EF デザイナーがビジュアル スタジオであるという問題がありましたが、このエンティティのキーを安全に変更する方法がわかりません。
私は使っている:
- ビジュアル スタジオ 2013
- C# 4.5
- MYSQL データベース
誰かが助けてくれることを願っています!