有没有办法只覆盖Entity Framework中的删除存储过程

时间:2015-09-21 18:47:19

标签: sql-server entity-framework stored-procedures

我的数据库中有一个存储过程,我想用它来删除" test"用户。我想用存储过程执行此操作,因为FK约束限制了通过代码执行此操作。所以我使用EF映射到存储过程。

我遇到的问题是,在我的日志中,我看到大量错误说

  

找不到存储过程user_update / user_insert。

当我使用这行代码时,实体框架可能会做什么:

modelBuilder.Entity<User>().MapToStoredProcedures(u => u.Delete(t => t.HasName("UserDelete").Parameter(b => b.ID, "@UserId")));

如上所述,它自动创建或认为以默认方式查找存储过程。

我只想将它用于删除选项,所以有没有办法让它忽略更新和插入选项,因为我已经有了处理该部分的方法?

1 个答案:

答案 0 :(得分:1)

不幸的是,使用EF6,您可以使用存储过程执行所有更新,插入和删除操作,或让EF在运行时处理查询。

这是一个小小的黑客来帮助你:

在代码中添加以下行

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .MapToStoredProcedures();
    }

这将建议EF使用EF惯例创建存储过程,如

 <type_name>_Insert, <type_name>_Update and <type_name>_Delete

上述惯例也是您遇到错误的原因。 EF期望User_InsertUser_Update存储过程。

现在继续使用您的User_Delete存储过程内容替换EF生成的UserDelete

PS:不要修改SP的参数。 User_Delete期望参数,EF将提供参数。来自EF的文档:

  

删除存储过程应该具有键值的参数   实体(或实体具有复合的多个参数)   键)。此外,删除过程还应具有参数   对于目标表上的任何独立关联外键   (没有相应外键属性的关系   在实体中声明)。