2

我在 VB.NET 应用程序上使用带有 FormView 的 EntityDataSource。FormView 包含一个带有多个选项卡的 AjaxControlToolKit TabContains。由于每个选项卡都是一个命名容器,因此 Bind 无法正常更新值(从阅读 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>

这很好用,直到编辑客户并将其名称设置为空(假设在这种情况下,允许使用空名称)。Name UpdateParameter 设置为 Null,但 ObjectStateEntry 未设置为针对 Null 属性进行修改,即使之前实体具有指定的值。只要将名称更改为 Null 以外的名称,所有内容都会正确更新。

我通过将以下代码放入 EntityDataSource 的更新事件中找到了一种解决方法。

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 回答