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

Microsoft.AspNet.EntityDataSource gives wrong entity's property value during Updating or Deleting

我正在使用 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>

它创建了一个 table 类型的记录(实体) 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 选择数据时,数据库看起来像这样。

数据库:

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(); 时不会发生保存,因为属​​性没有被修改。

这是一个错误还是我做错了什么?这种理念在 EF4 上运行良好,但在迁移到 EF6 后,问题就来了。

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

所以 eds_Deleting 完全不适用于数据库中的实体,而只能使用其在 GridView 中使用的部分。 GridView 中未使用的值为默认值(通常为 nullfalse)。

所以这就是 EF5 EntityDataSourceEF6 EntityDataSource 之间的区别。 EF5 版本可以使用完全加载的对象,但 EF6 不能。