如何在实体框架中定义存储过程(代码优先)?

Posted

技术标签:

【中文标题】如何在实体框架中定义存储过程(代码优先)?【英文标题】:How can I define a stored procedure in Entity Framework (code first)? 【发布时间】:2012-01-10 19:39:49 【问题描述】:

我在 Entity Framework 中定义了我的模型(代码优先),但是如何在我的模型中定义一个存储过程?当我的数据库从我的模型生成时,我想创建我的模型并让它在我的数据库中生成存储过程。

【问题讨论】:

我想从我的 Store 过程中定义一个模型。当我第一次使用我的模型时,Entity 在 SQL 服务器中生成我的 Store 过程。 这个相关问题有帮助吗? ***.com/questions/4845246/… 【参考方案1】:

说明

目前在 Entity Framework 代码中首先没有对存储过程的内置直接映射支持。但是您可以像我的示例中那样执行任何 sql 查询(创建您的存储过程)。

样本

public class MyDatabaseContext : DbContext

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        DbCommand cmd = Database.Connection.CreateCommand();
        cmd.CommandText = "create stored procedure ....";
        cmd.ExecuteNonQuery();
       

更多信息

MSDN - DbCommand Class

【讨论】:

你的回答对我很有用。 很高兴为您提供帮助,谢谢!祝你有美好的一天! 我收到以下错误:ExecuteNonQuery 需要一个打开且可用的连接。连接的当前状态为关闭。【参考方案2】:

我使用的是 Entity Framework 6,所以事情可能已经改变。数据库不是在 OnModelCreating 中创建的,但它确实在 DbInitializer 中像这样工作......

public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyDbContext> 
    protected override void Seed(MyDbContext context) 
        string sql = @"CREATE PROCEDURE...";
        context.Database.ExecuteSqlCommand(sql);

        base.Seed(context);
    

【讨论】:

迁移是否会跟踪以这种方式创建的存储过程的更改? @Craig,我想是的。我没有测试它。

以上是关于如何在实体框架中定义存储过程(代码优先)?的主要内容,如果未能解决你的问题,请参考以下文章

如何从实体框架中的存储过程中获取结果+数据库优先

在实体框架数据库优先方法中,如何从存储过程返回多个结果集?

使用实体框架核心生成和访问存储过程

在实体框架中使用存储过程

具有实体框架问题的 Informix 存储过程

如何在实体框架中调用带有联接的存储过程?