Asp.net EntityDataSource Null更新参数未标记为已修改
我正在VB.NET应用程序上使用带有FormView的EntityDataSource。FormView包含一个带有多个选项卡的AjaxControlToolKit选项卡。由于每个选项卡都是一个命名容器,因此Bind不能正确地用于更新值(从阅读stackoverflow上的其他文章中可以发现)。相反,我必须在EntityDataSource上声明UpdateParameters。示例标记如下所示:Asp.net EntityDataSource Null更新参数未标记为已修改,asp.net,vb.net,entity-framework-4,entitydatasource,objectstatemanager,Asp.net,Vb.net,Entity Framework 4,Entitydatasource,Objectstatemanager,我正在VB.NET应用程序上使用带有FormView的EntityDataSource。FormView包含一个带有多个选项卡的AjaxControlToolKit选项卡。由于每个选项卡都是一个命名容器,因此Bind不能正确地用于更新值(从阅读stackoverflow上的其他文章中可以发现)。相反,我必须在EntityDataSource上声明UpdateParameters。示例标记如下所示: <asp:FormView ID="fv" runat="server" DataSourc
<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>
这确保UpdateParameters中的每个属性都将其状态设置为modified。这是可行的,但它看起来像是一个黑客,我可以看到它在今后的道路上造成了问题。还有什么我可以做的吗?您是否为相关实体设置了“并发模式”?根据您实际更新实体的方式(我没有使用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转换为IOObjectContextAdapter,以便在代码中将ObjectContext传递给EntityDataSource),但我看到OP已经在使用旧EF:(.我不能使用他的方法,因为我在gridview中使用Bind(因此,没有显式的UpdateParameters)。我希望有一种替代方法来解决这个问题,而不是通过硬编码名称(我当前的解决方案)将两个可为空的属性显式标记为已更改。你找到解决方案了吗?请参阅我对Tihon答案的评论
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();
}