Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
C# 从实体框架中的DbContext生成数据脚本_C#_Sql Server_Entity Framework - Fatal编程技术网

C# 从实体框架中的DbContext生成数据脚本

C# 从实体框架中的DbContext生成数据脚本,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我正在处理EntityFramework,希望在即将保存更改时从DbContext对象生成并插入/更新/删除脚本。到目前为止,我只能通过使用以下代码片段从上下文中获取DDL脚本 string str = ((IObjectContextAdapter)_objDataContext).ObjectContext.CreateDatabaseScript(); 是否有方法为所有更改生成脚本?在调用SaveChanges()方法之前,没有任何内置方法为更改生成DML脚本,但是可以在调用SaveCh

我正在处理EntityFramework,希望在即将保存更改时从DbContext对象生成并插入/更新/删除脚本。到目前为止,我只能通过使用以下代码片段从上下文中获取DDL脚本

string str = ((IObjectContextAdapter)_objDataContext).ObjectContext.CreateDatabaseScript();

是否有方法为所有更改生成脚本?

在调用
SaveChanges()
方法之前,没有任何内置方法为更改生成DML脚本,但是可以在调用
SaveChanges()
后将insert/update/delete命令发送到DB时截获这些命令

EF6为此类场景引入了两个扩展点

可以将
\u objDataContext.Database.Log
属性设置为
TextWriter
,其中将记录上下文发出的所有SQL命令

另一个选项是实现一个拦截器,该拦截器在EF即将执行命令时或命令执行后由EF调用。拦截器允许您记录正在发送的SQL命令,甚至提供一种抑制命令执行的方法

要创建拦截器,您需要编写一个实现
IDbCommandInterceptor
接口的类,并在Entity Framework中注册该类

DbInterception.Add(new MyInterceptor());
有关更多详细信息,请参见



Entty Framework旧版本的解决方案可能是围绕当前的db提供程序包装提供程序。

这正是我要搜索的!还有一些可能帮助其他人的东西:StringBuilder sb=new StringBuilder();dbContext.Database.Log=s=>sb.AppendLine;