Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 用代码优先方法映射复杂存储过程_Entity Framework_Stored Procedures - Fatal编程技术网

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(); 
    } 
}