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

时间:2016-11-02 22:22:03

标签: c# asp.net entity-framework-6 asp.net-4.5 entitydatasource

我正在使用这样的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();时不会发生任何保存,因为属​​性未被修改。

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

1 个答案:

答案 0 :(得分:0)

{strong> isValid看起来必须是GridView中的可见列之一。

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

所以这尤其是EF5 EntityDataSourceEF6 EntityDataSource之间的区别。 EF5版本适用于完全加载的对象,但EF6不适用。