【发布时间】:2011-04-04 20:38:59
【问题描述】:
我想使用存储过程从数据库中检索实体,我不关心跟踪更改。我只需要解决所有实体,包括相关实体。
我必须使用 SqlCommand 吗?
那么复杂的属性呢,它们也会被解析吗?
还有其他限制可以告诉我吗?
谢谢!
【问题讨论】:
标签: entity-framework stored-procedures entity-framework-4.1
我想使用存储过程从数据库中检索实体,我不关心跟踪更改。我只需要解决所有实体,包括相关实体。
我必须使用 SqlCommand 吗?
那么复杂的属性呢,它们也会被解析吗?
还有其他限制可以告诉我吗?
谢谢!
【问题讨论】:
标签: entity-framework stored-procedures entity-framework-4.1
关于在 EF 中使用存储过程的一般答案是 here,因此纯 EF 中的存储过程不会处理导航属性。答案还提到了EFExtensions,但这在 DbContext API 中不可用。
要在 DbContext API 中执行存储过程,请使用:
var entities = context.Database.SqlQuery<MyEntity>(...);
DbContext API 不提供任何函数导入,例如 EDMX 和 ObjectContext API。
【讨论】:
Stored Procedures are not supported in Code First。因此,是的,如果您打算使用 Code First,则必须使用 SqlCommand 或您选择的数据库提供的任何内容。
DB First 或 Model First 支持存储过程。
【讨论】:
通过查看数据库优先方法,在自动生成的上下文类中,它将存储过程定义为虚拟函数,这里我分享我项目中的一个函数,这个存储过程返回一个复杂类型的问题。
public virtual ObjectResult<Question> GetMyInnerQuestions(Nullable<int> id)
{
var idParameter = id.HasValue ?
new ObjectParameter("Id", id) :
new ObjectParameter("Id", typeof(int));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Question>("GetMyInnerQuestions", idParameter);
}
我首先在我的代码中使用了它,我可以将存储过程如函数调用为:
IQueryable<Question> questions = db.GetMyInnerQuestions(id).AsQueryable();
希望有帮助
【讨论】: