Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net EntityDataSource Null更新参数未标记为已修改_Asp.net_Vb.net_Entity Framework 4_Entitydatasource_Objectstatemanager - Fatal编程技术网

Asp.net EntityDataSource Null更新参数未标记为已修改

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

我正在VB.NET应用程序上使用带有FormView的EntityDataSource。FormView包含一个带有多个选项卡的AjaxControlToolKit选项卡。由于每个选项卡都是一个命名容器,因此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>
这确保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();
}