我在这里为表格做映射。如何在此处映射存储过程?
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);
}
}
代码优先不支持存储过程。
您可以使用以下命令在数据库初始化器中执行脚本:
string sql = "CREATE PROCEDURE [MyProc]...";
context.Database.ExecuteSqlCommand(sql);
您可以从上下文中执行过程,如下所示:
string command = "EXEC MyProc";
IEnumerable<T> results = context.Database.SqlQuery<T>(command, null);
就个人而言,我将其包装成一个不错的OO模型。我有专门的SP类,使用强类型方法。这些方法使用一个属性进行修饰,该属性告知数据库初始化器从给定源创建给定名称的存储过程。强类型方法调用存储过程。
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>
我正在使用数据库上下文和数据库优先方法。创建存储过程后,转到VS中的模型页,然后在"模型"页的右键单击选项中选择"从数据库更新模型"。然后在模型浏览器中>函数导入中选择导入的 SP,如果我想更改它们的名称、返回值等,在所有这些之后,我可以像内部方法或其他实体类一样使用 SP。例如,假设您有一个名称为"sp_UserUpdate
"的 SP,该 SP 将userName
和考试userAge
作为内部参数,res
并将 out 参数作为结果状态的 out。在VS中导入SP后,您可以按如下方式使用它:
System.Data.Objects.ObjectParameter pRes = new System.Data.Objects.ObjectParameter("res", 0);
db.sp_UserUpdate(userName , userAge , pRes);
希望这有帮助。