【问题标题】:How to map a stored procedure using DBContext in ASP.NET MVC 3 Entity Framework如何在 ASP.NET MVC 3 Entity Framework 中使用 DBContext 映射存储过程
【发布时间】:2012-10-03 11:38:19
【问题描述】:

我在这里为表做映射。如何在这里映射存储过程?

public class AppDBContext : DbContext
{
    public DbSet<UserAccount> UserAccount { get; set; }
    public DbSet<GetUserAccounts> GetGetUserAccounts { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserAccount>().ToTable("UserAccount");
        modelBuilder.Entity<Customer>().ToTable("Customer");

        base.OnModelCreating(modelBuilder);
    }
}

【问题讨论】:

标签: c# asp.net-mvc-3 entity-framework stored-procedures


【解决方案1】:

代码优先不支持存储过程。

您可以使用以下方法在数据库初始化程序中执行脚本:

string sql = "CREATE PROCEDURE [MyProc]...";
context.Database.ExecuteSqlCommand(sql);

您可以像这样从上下文中执行程序:

string command = "EXEC MyProc";
IEnumerable<T> results = context.Database.SqlQuery<T>(command, null);

就我个人而言,我将其封装成一个不错的 OO 模型。我有专门的带有强类型方法的 SP 类。这些方法装饰有一个属性,该属性告诉 DB 初始化程序从给定源创建给定名称的存储过程。强类型方法调用存储过程。

【讨论】:

    【解决方案2】:

    AppDBContext 中添加:

    public virtual ObjectResult<ResultObject> MyStoredProcedure(string parameter)
            {
                ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(ResultObject).Assembly);
    
                var Param = parameter!= null ?
                    new ObjectParameter("Column", parameter) :
                    new ObjectParameter("Column", typeof(string));
    
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<ResultObject>("MyStoredProcedure", Param);
            }
    

    将此添加到 .edmx 文件中

    <FunctionImport Name="MyStoredProcedure" ReturnType="Collection(AppDBContext.ResultObject)" >
          <Parameter Name="ZipCode" Mode="In" Type="String" />
          </FunctionImport>
    

    【讨论】:

      【解决方案3】:

      我正在使用数据库上下文和数据库优先方法。创建存储过程后,进入VS中的模型页面,在模型页面的右键选项中选择从数据库中更新模型。然后在 Model Browser > Function Imports 中选择导入的 SP,如果我想更改它们的名称、返回值等。在所有这些之后,我可以使用与内部方法或其他实体类相同的 SP。例如,假设您有一个名为“sp_UserUpdate”的 SP,该 SP 将 userName 和考试 userAge 作为内部参数,并将 res 作为结果状态的输出参数。在 VS 中导入 SP 后,你可以像下面这样使用它:

      System.Data.Objects.ObjectParameter pRes = new System.Data.Objects.ObjectParameter("res", 0);
      db.sp_UserUpdate(userName , userAge , pRes);
      

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多