我的数据库中有一个存储过程,我想用它来删除" test"用户。我想用存储过程执行此操作,因为FK约束限制了通过代码执行此操作。所以我使用EF映射到存储过程。
我遇到的问题是,在我的日志中,我看到大量错误说
找不到存储过程user_update / user_insert。
当我使用这行代码时,实体框架可能会做什么:
modelBuilder.Entity<User>().MapToStoredProcedures(u => u.Delete(t => t.HasName("UserDelete").Parameter(b => b.ID, "@UserId")));
如上所述,它自动创建或认为以默认方式查找存储过程。
我只想将它用于删除选项,所以有没有办法让它忽略更新和插入选项,因为我已经有了处理该部分的方法?
答案 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_Insert
和User_Update
存储过程。
现在继续使用您的User_Delete
存储过程内容替换EF生成的UserDelete
。
PS:不要修改SP的参数。 User_Delete
期望参数,EF将提供参数。来自EF的文档:
删除存储过程应该具有键值的参数 实体(或实体具有复合的多个参数) 键)。此外,删除过程还应具有参数 对于目标表上的任何独立关联外键 (没有相应外键属性的关系 在实体中声明)。