1

私はEFの初心者です。したがって、楽観的同時実行性をテストするために、EF 5、WPF、および作成済みのデータベースを使用しました。WPF プロジェクトには、MainWindowTextBox1キーを介して顧客を検索するTextBox2ため、顧客の名前を編集するため、textblock (txtLog)フィールド値を記録するため、および保存ボタンが含まれています。同時実行アクセスをシミュレートするには、SQL Server 2008Management Studioupdate client set r01_nomcli = 'GGGGG' where r01_codcli = '4112010002';で、保存ボタンをクリックする前にクエリ " " を実行します。正常に動作DbUpdateConcurrencyExceptionし、起動されますが、エンティティの元の値が失われ、現在の値と同じ値になります。これは、エンティティの分離を引き起こす "using" ブロックが原因です。この問題を解決するには、ウィンドウのコンストラクターの直前でコンテキストを宣言し、"Window_Loaded「これを作成する別のイベントがありますか??? EF の使用のベスト プラクティスと、EF 5 を使用した再利用可能な DAL の構築がどのように歓迎されるかについて役立ちます。ありがとうございます。コードの下:

 public partial class OptimisticConcurrency : Window
{

//client is an entity

    client _currentClient = null;

    public OptimisticConcurrency()
    {
        InitializeComponent();
    }


    //**************************TextBox1 PreviewKeyDown Event Handler
    private void TextBox_PreviewKeyDown_1(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Enter)
        {

            using (dbleaseEntities context = new dbleaseEntities())
            {
                _currentClient = context.client.Find(txtCode.Text);
                if (_currentClient == null)
                    MessageBox.Show("Customer " + txtCode.Text + " not found.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                else
                    this.DataContext = _currentClient;
            }
        }
    }


//*****************Save Button Click Event Handler

private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        using (dbleaseEntities context = new dbleaseEntities())
        {
            context.Configuration.ValidateOnSaveEnabled = false;
            try
            {
                context.Entry(_currentClient).State = System.Data.EntityState.Modified;
                context.SaveChanges();
                MessageBox.Show("Success.", "Save", MessageBoxButton.OK,    MessageBoxImage.Information);
            }
            catch (DbEntityValidationException ex)
            {
                string ss = "";
                foreach (var error in ex.EntityValidationErrors)
                    ss = string.Join(Environment.NewLine, error.ValidationErrors.Select(v => v.ErrorMessage));
                MessageBox.Show(ss, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
             }

            catch (DbUpdateConcurrencyException ex)
            {
                string StrValues= "";
                DbPropertyValues ov = ex.Entries.Single().OriginalValues;
                DbPropertyValues cv = ex.Entries.Single().CurrentValues;
                DbPropertyValues dv = ex.Entries.Single().GetDatabaseValues();

                StrValues=  "Original value  : " + ov["r01_nomcli"] + Environment.NewLine +
                            "Current value   : " + cv["r01_nomcli"] + Environment.NewLine +
                            "Database value  : " + dv["r01_nomcli"];

               txtLog.Text = StrValues



            }
        }
    }
4

1 に答える 1

0

おおよそ3つのオプションがあります

  1. 現在行っていることを実行します。つまり、オブジェクトをコンテキストに接続したままにします
  2. セルフ トラッキング エンティティを使用する: http://blogs.msdn.com/b/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
  3. GetDatabaseValues を使用する
于 2013-02-14T09:30:05.787 に答える