参数不会传递给映射为Delete函数的SQL存储过程

时间:2014-01-16 15:43:25

标签: c# .net entity-framework stored-procedures entity-framework-6

我是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个额外参数包含错误的旧值。

重现的步骤:

  1. 创建包含4个参数的存储过程。

    CREATE PROCEDURE ParcelDeleteFomSDE (@Id int, @RightOfWayProject_Id int, @NextDate DateTime2, @Login nvarchar(max))
    
  2. 将此程序映射为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>
    
  3. 在C#代码中加载来自数据库的记录:

    Parcel parcel= DBSet.Find(ID);
    
  4. 修改此记录的两个字段:

    parcel.NextDate="2014-01-16";
    parcel.Login="StackOverflow Login";
    
  5. 删除此记录:

    DBSet.Remove(parcel);
    
  6. 运行save到数据库:

    DBContainer.SaveChanges();
    
  7. 现在执行存储过程ParcelDeleteFomSDE,但问题是@NextDate和@Login包含旧值 - 即在步骤4中完成的修改)将被忽略!

  8. 这是EF6中的错误还是忽略新值的事实是设计?

    我在这里找到了类似的主题: Can I pass additional parameters to the insert/update/delete SPs that are mapped to an entity? 上述主题的答案也将满足我的情况。

0 个答案:

没有答案