【问题标题】:Is there a way to override only delete stored procedure in Entity Framework有没有办法覆盖实体框架中的仅删除存储过程
【发布时间】:2015-09-21 18:47:18
【问题描述】:

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

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

找不到存储过程 user_update/user_insert。

当我使用这行代码时,Entity Framework 所做的可能是这样的:

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

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

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

【问题讨论】:

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


    【解决方案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 存储过程。

    现在继续,将 EF 生成的 User_Delete 替换为您的 UserDelete 存储过程内容。

    PS:不要修改SP的参数。 User_Delete 需要一个参数,EF 将提供它们。来自 EF 的文档:

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

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多