0

最初に 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つのいずれかであると感じています:

  1. EF は値をどこかにキャッシュしています。キャッシュをクリアするにはどうすればよいですか?
  2. 少し前に、エンティティのキ​​ーがめちゃくちゃになる EF デザイナーがビジュアル スタジオであるという問題がありましたが、このエンティティのキ​​ーを安全に変更する方法がわかりません。

私は使っている:

  • ビジュアル スタジオ 2013
  • C# 4.5
  • MYSQL データベース

誰かが助けてくれることを願っています!

4

0 に答える 0