Entity framework 用代码优先方法映射复杂存储过程
是否可以使用实体框架代码优先的方法来映射已经创建的存储过程 例如,我有一个复杂的存储过程,我想用代码优先的方法来映射它Entity framework 用代码优先方法映射复杂存储过程,entity-framework,stored-procedures,Entity Framework,Stored Procedures,是否可以使用实体框架代码优先的方法来映射已经创建的存储过程 例如,我有一个复杂的存储过程,我想用代码优先的方法来映射它 我将运行使用迁移创建存储过程的脚本,以便该过程始终可用,但如何使用代码优先方法映射它?好的,没有内置的支持以代码优先映射存储过程。虽然可以使用ObjectContext的Translate方法映射过程的结果,但您必须手动调用该过程 例如 使用(var db=new BloggingContext()) { //如果首先使用代码,我们需要确保在打开连接之前构建了模型 //对于使
我将运行使用迁移创建存储过程的脚本,以便该过程始终可用,但如何使用代码优先方法映射它?好的,没有内置的支持以代码优先映射存储过程。虽然可以使用
ObjectContext
的Translate
方法映射过程的结果,但您必须手动调用该过程
例如
使用(var db=new BloggingContext())
{
//如果首先使用代码,我们需要确保在打开连接之前构建了模型
//对于使用EF设计器创建的模型,这不是必需的
初始化(强制:false);
//创建SQL命令以执行存储过程
var cmd=db.Database.Connection.CreateCommand();
cmd.CommandText=“[dbo].[GetAllBlogsAndPosts]”;
尝试
{
db.Database.Connection.Open();
//运行存储过程
var reader=cmd.ExecuteReader();
//从第一个结果集中阅读博客
var blogs=((IObjectContextAdapter)db)
.ObjectContext
.Translate(阅读器,“博客”,MergeOption.AppendOnly);
foreach(博客中的var项)
{
Console.WriteLine(项目名称);
}
//移动到第二个结果集并阅读文章
reader.NextResult();
var posts=((IObjectContextAdapter)db)
.ObjectContext
.Translate(阅读器,“Posts”,MergeOption.AppendOnly);
foreach(POST中的var项目)
{
控制台写入线(项目名称);
}
}
最后
{
db.Database.Connection.Close();
}
}
如果使用的是.EDMX
文件,还可以映射返回更复杂类型的存储过程。有关更多详细信息,请参阅
注意:您可以添加T4模板来添加自定义映射,以便在每次生成
.EDMX
时添加自定义存储过程映射 另外,没有内置的支持先在代码中映射存储过程。虽然可以使用ObjectContext
的Translate
方法映射过程的结果,但您必须手动调用该过程
例如
使用(var db=new BloggingContext())
{
//如果首先使用代码,我们需要确保在打开连接之前构建了模型
//对于使用EF设计器创建的模型,这不是必需的
初始化(强制:false);
//创建SQL命令以执行存储过程
var cmd=db.Database.Connection.CreateCommand();
cmd.CommandText=“[dbo].[GetAllBlogsAndPosts]”;
尝试
{
db.Database.Connection.Open();
//运行存储过程
var reader=cmd.ExecuteReader();
//从第一个结果集中阅读博客
var blogs=((IObjectContextAdapter)db)
.ObjectContext
.Translate(阅读器,“博客”,MergeOption.AppendOnly);
foreach(博客中的var项)
{
Console.WriteLine(项目名称);
}
//移动到第二个结果集并阅读文章
reader.NextResult();
var posts=((IObjectContextAdapter)db)
.ObjectContext
.Translate(阅读器,“Posts”,MergeOption.AppendOnly);
foreach(POST中的var项目)
{
控制台写入线(项目名称);
}
}
最后
{
db.Database.Connection.Close();
}
}
如果使用的是.EDMX
文件,还可以映射返回更复杂类型的存储过程。有关更多详细信息,请参阅
注意:您可以添加T4模板来添加自定义映射,以便在每次生成
.EDMX
时添加自定义存储过程映射 有可能使用edmx进行代码优先方法吗?在某种程度上是可能的。安装后,您可以右键单击解决方案视图中的上下文,单击“实体框架”,然后选择“查看实体数据模型”。这将从dbcontext类生成EDMX。不支持逐层次结构表类型。例如,Tranlate抛出一个异常,表示它无法实例化抽象基类型。显然,它也没有考虑自定义列映射,因此它确实无法从存储过程加载实体。是否可以使用edmx作为代码优先方法?某种程度上是可能的。安装后,您可以右键单击解决方案视图中的上下文,单击“实体框架”,然后选择“查看实体数据模型”。这将从dbcontext类生成EDMX。不支持逐层次结构表类型。例如,Tranlate抛出一个异常,表示它无法实例化抽象基类型。显然,它也没有考虑自定义列映射,因此它实际上无法从存储过程加载实体。
using (var db = new BloggingContext())
{
// If using Code First we need to make sure the model is built before we open the connection
// This isn't required for models created with the EF Designer
db.Database.Initialize(force: false);
// Create a SQL command to execute the sproc
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = "[dbo].[GetAllBlogsAndPosts]";
try
{
db.Database.Connection.Open();
// Run the sproc
var reader = cmd.ExecuteReader();
// Read Blogs from the first result set
var blogs = ((IObjectContextAdapter)db)
.ObjectContext
.Translate<Blog>(reader, "Blogs", MergeOption.AppendOnly);
foreach (var item in blogs)
{
Console.WriteLine(item.Name);
}
// Move to second result set and read Posts
reader.NextResult();
var posts = ((IObjectContextAdapter)db)
.ObjectContext
.Translate<Post>(reader, "Posts", MergeOption.AppendOnly);
foreach (var item in posts)
{
Console.WriteLine(item.Title);
}
}
finally
{
db.Database.Connection.Close();
}
}