2016-04-21 12 views
21

Trong Entity Framework 6, là nó có thể để xem các SQL sẽ được thực hiện cho một chèntrước SaveChanges gọi?Entity Framework 6 - Làm thế nào tôi có thể xem các SQL sẽ được tạo ra cho một chèn trước khi gọi SaveChanges

using (var db = new StuffEntities()){ 
    db.Things.Add(new Thing({...}); 
    //can I get the SQL insert statement at this point? 
    db.SaveChanges(); 
} 

Tôi quen với làm thế nào để có được SQL được tạo ra cho một truy vấn trước khi thực hiện như vậy:

var query = db.Thing.Where(x => x.ID == 9); 
Console.WriteLine(query.ToString()); 
//this prints the SQL select statement 

Truy vấn trả về một IQueryable <> trong khi một chèn trả về một DbSet và gọi ToString trên một DbSet chỉ cần in tên đối tượng tiêu chuẩn.

Trả lời

13

Một lựa chọn khác (nếu tôi hiểu câu hỏi của bạn một cách chính xác), sẽ được sử dụng một thực hiện IDbCommandInterceptor, mà dường như cho phép bạn kiểm tra câu lệnh SQL trước khi chúng được thực hiện (Tôi tự bảo hiểm lời của tôi vì tôi đã không sử dụng bản thân này).

Something như thế này:

public class CommandInterceptor : IDbCommandInterceptor 
{ 
    public void NonQueryExecuting(
     DbCommand command, DbCommandInterceptionContext<int> interceptionContext) 
    { 
     // do whatever with command.CommandText 
    } 
} 

đăng ký nó bằng cách sử dụng lớp DBInterception sẵn trong EF trong bối cảnh constructor tĩnh của bạn:

static StuffEntities() 
{ 
    Database.SetInitializer<StuffEntities>(null); // or however you have it 
    System.Data.Entity.Infrastructure.Interception.DbInterception.Add(new CommandInterceptor()); 
} 
+0

Nó hoạt động! Bạn chỉ cần thiết lập interceptionContext.Result và nó sẽ dừng IO cơ sở dữ liệu. Cảm ơn! –

+0

là DbInterception không DbInterceptor – sam

5

đánh chặn sử dụng để xem chi tiết thấy điều này link

thêm vào trong này để .config tập tin

<interceptors> 
    <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework"> 
    <parameters> 
     <parameter value="C:\Temp\LogOutput.txt"/> 
    </parameters> 
    </interceptor> 
</interceptors> 
+0

Không chỉ nhật ký này sau khi thực hiện thao tác cơ sở dữ liệu thực tế, tức là sau khi tôi gọi SaveChanges? –

+0

có AFAIK để biết thêm thông tin, bạn có thể xem liên kết này http://entityframework.codeplex.com/SourceControl/latest#src/EntityFramework/Infrastructure/Interception/DatabaseLogger.cs và ghi đè> IDbConfigurationInterceptor cho nhật ký tùy chỉnh của bạn – rashfmnb

+0

Câu hỏi của tôi là cụ thể về việc nhìn thấy SQL trước khi nó được thực hiện. –

9

Không có tương đương với query.ToString() AFAIK. Sau cùng, bạn có thể sử dụng DbContext.Database.Log tài sản:

db.Database.Log = s => 
{ 
    // You can put a breakpoint here and examine s with the TextVisualizer 
    // Note that only some of the s values are SQL statements 
    Debug.Print(s); 
}; 
db.SaveChanges(); 
13

Cách đơn giản nhất trong EF6 Để có truy vấn luôn tiện dụng, mà không thay đổi mã là để thêm này vào DbContext của bạn và sau đó chỉ cần kiểm tra các truy vấn trên cửa sổ đầu ra trong studio trực quan, trong khi gỡ lỗi.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    Database.Log = (query)=> Debug.Write(query); 
} 

EDIT

LINQPad cũng là một lựa chọn tốt để gỡ lỗi LINQ với và cũng có thể hiển thị các truy vấn SQL.

+0

Tôi không thể nói cho EF6 nhưng điều này dường như không hoạt động trong EF Core mới. – tnktnk

+0

Xem: Ghi lại khung thực thể và chặn hoạt động cơ sở dữ liệu (EF6 trở đi) tại đây: https://msdn.microsoft.com/en-us/library/dn469464(v=vs.113).aspx – DeveloperDan

Các vấn đề liên quan