Microsoft.AspNet.EntityDataSource在更新或删除时给出错误的实体属性值

本文关键字:错误 出错 实体 属性 EntityDataSource AspNet 更新 删除 Microsoft | 更新日期: 2023-09-27 18:15:57

我是这样使用Microsoft.AspNet.EntityDataSource的:

ASPX:

<asp:GridView runat="server" DataSourceID="eds" ID="gv" AutoGenerateColumns="false" DataKeyNames="ID">
  <Columns>
    <asp:BoundField DataField="ID" HeaderText="#" ReadOnly="true" />
    <asp:BoundField DataField="Name" HeaderText="Name" />
    <asp:BoundField DataField="Code" HeaderText="Code" ReadOnly="true" />
    <asp:CommandField ButtonType="Button" ShowEditButton="true" ShowDeleteButton="true" />
  </Columns>
</asp:GridView>
<ef:EntityDataSource runat="server" ID="eds" ConnectionString="name=Entities" 
                     EnableDelete="true" EnableInsert="True" EnableUpdate="True"
                     EntitySetName="awCategoryGroups" DefaultContainerName="Entities" EnableFlattening="False"
                     Where="it.isValid=true"  OrderBy="it.Name asc" OnDeleting="eds_Deleting">
</ef:EntityDataSource>

创建一个记录(实体)类型为awCategoryGroup的表。问题是,当我想删除使用删除按钮从GridView CommandField调用eds_Deleting方法的记录。

c#:

protected void eds_Deleting(object sender, Microsoft.AspNet.EntityDataSource.EntityDataSourceChangingEventArgs e)
{
    awCategoryGroup cg = (awCategoryGroup)e.Entity;
    cg.isValid = false;
    e.Context.SaveChanges();
    e.Cancel = true;
}

GridView选择数据时,数据库看起来是这样的。

DB:

ID  Name    Code    isValid
==========================================
19  Roles   UserRole    True
20  Actions ActionType  True

目标应该设置isValid列为False。但是当eds_Deleting方法被调用时,(awCategoryGroup)e.Entity包含其属性的对应值,除了bool(在DB中作为bit)值的属性isValid应该是True,但是在我设置它之前它已经是False了。所以当调用e.Context.SaveChanges();时不会发生保存,因为属性没有被修改。

是bug还是我做错了什么?这一理念在EF4上运行良好,但在迁移到EF6之后,出现了问题。

Microsoft.AspNet.EntityDataSource在更新或删除时给出错误的实体属性值

看起来 isValid必须作为GridView中的可见列之一

所以eds_Deleting完全不与数据库中的实体一起工作,而只与GridView中使用的部分一起工作。GridView中未使用的值为默认值(通常为nullfalse)。

这就是EF5 EntityDataSourceEF6 EntityDataSource之间的差异。EF5版本可以完全加载对象,但EF6不能

相关文章: