我正在使用这样的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后,存在问题。
答案 0 :(得分:0)
{strong> isValid
看起来必须是GridView
中的可见列之一。
所以eds_Deleting
完全不能与数据库中的实体一起使用,而只能在GridView
中使用它的部分。 GridView
中未使用的值具有默认值(通常为null
或false
)。
所以这尤其是EF5 EntityDataSource
和EF6 EntityDataSource
之间的区别。 EF5版本适用于完全加载的对象,但EF6不适用。