我是Entity Framework 6的新手。我希望将SQL存储过程映射为“删除”功能,以使用在执行删除记录期间传递的参数。 当我执行“删除”操作时,我需要对数据库进行额外的清理,为此我需要在“删除”存储过程中添加其他参数。
我传递了4个参数:要删除的实体的ID, FK到父实体(虽然我不需要,但EF 6请求。见http://pamelayang.blogspot.com/2009/07/entity-framework-error-2048-when-using.html)。这两个第一参数按预期工作。接下来,我传递了2个附加参数,这些参数应该包含先前加载到C#内存中的记录的已修改字段的值。
在查看SQL事件探查器2时,第一个参数(PK和FK)正确传递到存储过程,但是另外两个参数具有旧值。当我跳过以下示例(DBSet.Remove(parcel);
)中的步骤5)时,在执行DBContainer.SaveChanges();
存储过程期间执行映射为“更新”操作,并且这两个额外参数具有正确的NEW值。但在“删除”操作期间,这2个额外参数包含错误的旧值。
重现的步骤:
创建包含4个参数的存储过程。
CREATE PROCEDURE ParcelDeleteFomSDE (@Id int, @RightOfWayProject_Id int, @NextDate DateTime2, @Login nvarchar(max))
将此程序映射为EDMX中的删除功能(或使用Visual Studio EDMX设计器):
<DeleteFunction FunctionName="ELSCE.Store.ParcelDeleteFomSDE>
<ScalarProperty Name="Id" ParameterName="Id" />
<AssociationEnd AssociationSet="RightOfWayProjectParcel" From="Parcel" To="RightOfWayProject"><ScalarProperty Name="Id" ParameterName="RightOfWayProject_Id" />
</AssociationEnd>
<ScalarProperty Name="NextDate" ParameterName="NextDate" />
<ScalarProperty Name="Login" ParameterName="Login" />
</DeleteFunction>
在C#代码中加载来自数据库的记录:
Parcel parcel= DBSet.Find(ID);
修改此记录的两个字段:
parcel.NextDate="2014-01-16";
parcel.Login="StackOverflow Login";
删除此记录:
DBSet.Remove(parcel);
运行save到数据库:
DBContainer.SaveChanges();
现在执行存储过程ParcelDeleteFomSDE,但问题是@NextDate和@Login包含旧值 - 即在步骤4中完成的修改)将被忽略!
这是EF6中的错误还是忽略新值的事实是设计?
我在这里找到了类似的主题: Can I pass additional parameters to the insert/update/delete SPs that are mapped to an entity? 上述主题的答案也将满足我的情况。