Tôi có thể thấy SQL được tạo bởi Entity Framework cho các hoạt động chọn trong Visual studio, nhưng không phải để chèn, cập nhật và xóa. làm thế nào tôi có thể thấy SQL được tạo ra cho "DataContext.SaveChanges" lệnh trong Visual studio trong khi gỡ lỗi?xem SQL được tạo cho lệnh Entity Framewok SaveChanges trong Visual studio?
Trả lời
Nếu bạn có phòng thu trực quan, bạn có thể xem các bản cập nhật và chèn trong intellitrace. Chỉ cần đặt một điểm ngắt ngay sau khi SaveChanges được gọi.
http://www.youtube.com/watch?v=fLBpZNXs-Lw
Nếu bạn đang sử dụng nó trên một dự án web bạn cũng có thể sử dụng mini-profiler.
Có một cái nhìn tại this thread trên các diễn đàn MSDN; cụ thể, bài đăng của g_yordanov. Ông đã cung cấp một số mã có thể truy xuất các câu lệnh SQL tương ứng cho tất cả các thay đổi trong một lược đồ dữ liệu EF.
Là tuyên bố từ chối trách nhiệm, mã này liên quan đến việc phản ánh trên nội bộ của EF và có thể bị hỏng trong các phiên bản sau. Nhưng hiện tại, nó hoạt động hoàn hảo trong tất cả các ứng dụng EF của chúng tôi.
Đây là mã, để tham khảo, chỉ trong trường hợp liên kết biến mất.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data.Objects;
using System.Data.Common;
using System.Data.EntityClient;
using System.Collections;
namespace EntityExtensionMethods
{
public static class CustomExtensions
{
private static readonly string entityAssemblyName =
"system.data.entity, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
public static string ToTraceString(this IQueryable query)
{
System.Reflection.MethodInfo toTraceStringMethod = query.GetType().GetMethod("ToTraceString");
if (toTraceStringMethod != null)
return toTraceStringMethod.Invoke(query, null).ToString();
else
return "";
}
public static string ToTraceString(this ObjectContext ctx)
{
Assembly entityAssemly = Assembly.Load(entityAssemblyName);
Type updateTranslatorType = entityAssemly.GetType(
"System.Data.Mapping.Update.Internal.UpdateTranslator");
Type functionUpdateCommandType = entityAssemly.GetType(
"System.Data.Mapping.Update.Internal.FunctionUpdateCommand");
Type dynamicUpdateCommandType = entityAssemly.GetType(
"System.Data.Mapping.Update.Internal.DynamicUpdateCommand");
object[] ctorParams = new object[]
{
ctx.ObjectStateManager,
((EntityConnection)ctx.Connection).GetMetadataWorkspace(),
(EntityConnection)ctx.Connection,
ctx.CommandTimeout
};
object updateTranslator = Activator.CreateInstance(updateTranslatorType,
BindingFlags.NonPublic | BindingFlags.Instance, null, ctorParams, null);
MethodInfo produceCommandsMethod = updateTranslatorType
.GetMethod("ProduceCommands", BindingFlags.Instance | BindingFlags.NonPublic);
object updateCommands = produceCommandsMethod.Invoke(updateTranslator, null);
List<DbCommand> dbCommands = new List<DbCommand>();
foreach (object o in (IEnumerable)updateCommands)
{
if (functionUpdateCommandType.IsInstanceOfType(o))
{
FieldInfo m_dbCommandField = functionUpdateCommandType.GetField(
"m_dbCommand", BindingFlags.Instance | BindingFlags.NonPublic);
dbCommands.Add((DbCommand)m_dbCommandField.GetValue(o));
}
else if (dynamicUpdateCommandType.IsInstanceOfType(o))
{
MethodInfo createCommandMethod = dynamicUpdateCommandType.GetMethod(
"CreateCommand", BindingFlags.Instance | BindingFlags.NonPublic);
object[] methodParams = new object[]
{
updateTranslator,
new Dictionary<long, object>()
};
dbCommands.Add((DbCommand)createCommandMethod.Invoke(o, methodParams));
}
else
{
throw new NotSupportedException("Unknown UpdateCommand Kind");
}
}
StringBuilder traceString = new StringBuilder();
foreach (DbCommand command in dbCommands)
{
traceString.AppendLine("=============== BEGIN COMMAND ===============");
traceString.AppendLine();
traceString.AppendLine(command.CommandText);
foreach (DbParameter param in command.Parameters)
{
traceString.AppendFormat("{0} = {1}", param.ParameterName, param.Value);
traceString.AppendLine();
}
traceString.AppendLine();
traceString.AppendLine("=============== END COMMAND ===============");
}
return traceString.ToString();
}
}
}
Dưới đây là một cái gì đó thực sự đơn giản mà tôi tìm thấy:
context.Database.Log = x => System.Diagnostics.Debug.WriteLine(x);
Xem: Ghi lại khung thực thể và chặn các 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
Tôi biết điều này là cũ, nhưng nó đã được liên kết đầu tiên đã đưa ra trong tìm kiếm của tôi vì vậy tôi đã nghĩ rằng tôi muốn gửi mà giải pháp đơn giản nhất đối với tôi là sử dụng SQL Profiler mỗi:
String or binary data would be truncated.The statement has been terminated
tiếc ... chỉ thấy rằng OP không có quyền truy cập vào Profiler, nhưng liên kết vẫn còn tốt cho givin g hướng dẫn cho những người làm!
Bạn có thể thêm phần này dưới dạng một bình luận nhưng một câu trả lời nên trực tiếp cố gắng giải quyết các câu hỏi của OP – techspider
Đoán bạn không có phiên bản đầy đủ của SqlServer – Will
có thể trùng lặp của [Làm thế nào để tôi xem SQL được tạo bởi khung thực thể?] (Http://stackoverflow.com/questions/1412863/how-do-i -view-the-sql-generated-by-the-entity-framework) – jrummell
Tôi đang sử dụng phiên bản đầy đủ của máy chủ SQL, nhưng tôi không có quyền sử dụng lược tả SQL Server. nhưng tôi có thể thấy sql cho các lựa chọn trong Visual studio, nhưng không cập nhật. tại sao? Tôi thấy một lá phiếu để đóng bài đăng này, bởi vì tôi muốn biết liệu có giải pháp thay thế cho trình biên dịch máy chủ SQL hay không. – RKP