【问题标题】:EntityDataSource Null Update Pameters not getting marked ModifiedEntityDataSource Null 更新参数未标记为已修改
【发布时间】:2011-02-25 06:03:53
【问题描述】:

我在 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 中的每个属性都将其状态设置为已修改。它有效,但它看起来像一个黑客,我可以看到它会导致问题。还有什么我可以做的吗?

【问题讨论】:

  • 您找到解决方案了吗?查看我对 Tihon 回答的评论

标签: asp.net vb.net entity-framework-4 entitydatasource objectstatemanager


【解决方案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 将假定它的原始值没有被触及。这可能是您应该研究的问题。如果这没有帮助,我深表歉意,但它可能会将您推向正确的方向。

【讨论】:

  • 您对此有更多详细信息吗?我在我们的页面中遇到了完全相同的问题。起初我认为这是 ObjectContext 和新 EF 的一些兼容性问题(我将 DbContext 转换为 IObjectContextAdapter 以在代码中将 ObjectContext 传递给 EntityDataSource),但我看到 OP 已经在使用旧 EF :(。我不能使用他的方法,因为我在 gridview 中使用 Bind(所以,没有明确的 UpdateParameters)。我想要一个替代方法来解决这个问题,而不是通过硬编码它们的名称来明确地将两个可为空的属性标记为已更改(我当前的解决方案)。
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多