EntityDataSource Null更新パラメーターが変更済みとしてマークされない

asp.net entity-framework-4 entitydatasource objectstatemanager vb.net
EntityDataSource Null更新パラメーターが変更済みとしてマークされない

VB.NETアプリケーションのFormViewでEntityDataSourceを使用しています。 FormViewには、複数のタブを持つAjaxControlToolKit TabContainsが含まれています。 各タブは名前付けコンテナーであるため、Bindは値を更新するために適切に動作しません(stackoverflowの他の投稿を読んで発見したように)。 代わりに、EntityDataSourceでUpdateParametersを宣言する必要があります。 マークアップの例は次のとおりです。

これは、顧客が編集され、その名前が何も設定されない限り、うまく機能します(この場合、null名が許可されます)。 Name UpdateParameterはNullに設定されますが、以前にEntityに値が指定されていたとしても、ObjectStateEntryはNullプロパティに対して修正済みに設定されていません。 名前がNull以外に変更される限り、すべてが正しく更新されます。

EntityDataSourceのUpdatingイベントに次のコードを配置することで回避策を見つけました。

Dim ose As ObjectStateEntry = context.ObjectStateManager.GetObjectStateEntry(action)
For Each p As Parameter In eds.UpdateParameters
  ose.SetModifiedProperty(p.Name)
Next

これにより、UpdateParametersの各プロパティの状態が変更済みに設定されます。 それは機能しますが、ハックのように見え、将来的に問題を引き起こすことがわかります。 他にできることはありますか?

  2  1


ベストアンサー

問題のエンティティに「同時実行モード」が設定されていますか? 実際にエンティティを更新する方法に応じて(EntityDataSourceは使用していませんが、ObjectContext.Attachメソッドを内部で使用していると推測しています)、SQLステートメントを作成するコードは、実際にある列のみを更新しようとしますかわった。

次の点を考慮してください。

void UpdatePersonEntity(int id, string firstName, string lastName)
{
    Person p = new Person { Id = id };
    this.Context.People.Attach(p);
    p.FirstName = firstName;
    p.LastName = lastName;

    this.Context.SaveChanges();
}

firstNameまたはlastNameがnullの場合、ObjectContextは元の値が変更されていないと想定します。 これはあなたが検討すべきものかもしれません。 これが役に立たない場合はおaび申し上げますが、正しい方向に進む可能性があります。

2


タイトルとURLをコピーしました