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
中未使用的值为默认值(通常为 null
或 false
)。
所以这就是 EF5 EntityDataSource
和 EF6 EntityDataSource
之间的区别。 EF5 版本可以使用完全加载的对象,但 EF6 不能。
我正在使用 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
中未使用的值为默认值(通常为 null
或 false
)。
所以这就是 EF5 EntityDataSource
和 EF6 EntityDataSource
之间的区别。 EF5 版本可以使用完全加载的对象,但 EF6 不能。