私はEFの初心者です。したがって、楽観的同時実行性をテストするために、EF 5、WPF、および作成済みのデータベースを使用しました。WPF プロジェクトには、MainWindow
主TextBox1
キーを介して顧客を検索するTextBox2
ため、顧客の名前を編集するため、textblock (txtLog)
フィールド値を記録するため、および保存ボタンが含まれています。同時実行アクセスをシミュレートするには、SQL Server 2008
Management 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
}
}
}