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
方法的记录。
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();
时不会发生保存,因为属性没有被修改。
是bug还是我做错了什么?这一理念在EF4上运行良好,但在迁移到EF6之后,出现了问题。
看起来 isValid
必须作为GridView
中的可见列之一。
所以eds_Deleting
完全不与数据库中的实体一起工作,而只与GridView
中使用的部分一起工作。GridView
中未使用的值为默认值(通常为null
或false
)。
这就是EF5 EntityDataSource
和EF6 EntityDataSource
之间的差异。EF5版本可以完全加载对象,但EF6不能