2

VB.NETアプリケーションのFormViewでEntityDataSourceを使用しています。FormViewには、複数のタブを持つAjaxControlToolKitTabContainsが含まれています。各タブがネーミングコンテナであるため、バインドは値を更新するために正しく機能しません(stackoverflowの他の投稿を読んで発見されたように)。代わりに、EntityDataSourceでUpdateParametersを宣言する必要があります。マークアップの例は次のとおりです。

<asp:FormView ID="fv" runat="server" DataSourceID="eds" DataKeyNames="ID">
<EditItemTemplate>  
    <asp:TabContainer ID="tc" runat="server">
        <asp:TabPanel ID="tp" runat="server" HeaderText="Tab 1">
            <ContentTemplate>
                <asp:TextBox ID="tbName" runat="server" Text='<%#Eval("Name") %>'></asp:TextBox>
            </ContentTemplate>
        </asp:TabPanel>
    </asp:TabContainer>
</EditItemTemplate> 
</asp:FormView>

<asp:EntityDataSource ID="eds" runat="server" ConnectionString="name=NDSEntities"
DefaultContainerName="NDSEntities" EnableFlattening="False" EntitySetName="Customers"
    Where="it.ID = @ID" EnableUpdate="true" EnableInsert="true">
    <WhereParameters>
        <asp:QueryStringParameter Name="ID" QueryStringField="ID" DbType="Guid" />
    </WhereParameters>
    <UpdateParameters>
        <asp:ControlParameter Name="Name" ControlID="fv$tc$tp$tbName" DbType="String" />
</UpdateParameters>
    <InsertParameters>
        <asp:ControlParameter Name="Name" ControlID="fv$tc$tp$tbName" DbType="String" />
</InsertParameters>
</EntityDataSource>

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

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

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

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

4

1 に答える 1

2

問題のエンティティに対して「同時実行モード」が設定されていますか? エンティティを実際に更新する方法に応じて (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 は元の値が変更されていないと想定します。これはあなたが調べるべきものかもしれません。これが役に立たない場合は申し訳ありませんが、正しい方向に進む可能性があります.

于 2011-02-24T22:03:53.430 に答える