2012-02-18 31 views
6

Tôi đang cố gắng tích hợp MvcMiniProfiler vào dự án asp.net mvc + entity framewok của mình. Tất cả mọi thứ là ok cho lần đầu tiên yêu cầu web nhưng nó là cho ngoại lệ tại các yêu cầu khác.MvcMiniProfiler Không thể truyền đối tượng kiểu EFProfiledDbConnection

Dự án của tôi là
MVC 3
Entity Framework 4.1 (DatabaseFirst + POCO Generator DbContext)
MvcMiniProfiler.dll 1.9.0.0
MvcMiniProfiler.EntityFramework.dll 1.9.1.0
tôi cài đặt MvcMiniProfiler từ Nu-Nhận

thêm bên dưới để global.asax

protected void Application_BeginRequest() 
    { 
     if (Request.IsLocal) 
     { 
      MvcMiniProfiler.MiniProfiler.Start(); 
      MiniProfilerEF.Initialize();  
     } 
    } 

thêm bên dưới để web.config

<system.data> 
    <DbProviderFactories> 
     <remove invariant="MvcMiniProfiler.Data.ProfiledDbProvider" /> 
     <add name="MvcMiniProfiler.Data.ProfiledDbProvider" invariant="MvcMiniProfiler.Data.ProfiledDbProvider" description="MvcMiniProfiler.Data.ProfiledDbProvider" type="MvcMiniProfiler.Data.ProfiledDbProviderFactory, MvcMiniProfiler, Version=1.8.0.0, Culture=neutral, PublicKeyToken=b44f9351044011a3" /> 
    </DbProviderFactories> 
    </system.data> 

Tôi nhận được ngoại lệ này

System.InvalidCastException was unhandled by user code 
    Message=Unable to cast object of type 'MvcMiniProfiler.Data.EFProfiledDbConnection' to type 'System.Data.SqlClient.SqlConnection'. 
    Source=System.Data 
    StackTrace: 
     at System.Data.SqlClient.SqlCommand.set_DbConnection(DbConnection value) 
     at System.Data.Common.DbCommand.set_Connection(DbConnection value) 
     at MvcMiniProfiler.Data.ProfiledDbCommand.set_DbConnection(DbConnection value) in C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:line 118 
     at System.Data.Common.DbCommand.set_Connection(DbConnection value) 
     at System.Data.Common.Utils.CommandHelper.SetStoreProviderCommandState(EntityCommand entityCommand, EntityTransaction entityTransaction, DbCommand storeProviderCommand) 
     at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 
     at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) 


ngoại lệ được xảy ra trong các cuộc gọi EF

ModaEntitiesWrapper.GetInstance().Articles 
       .AsNoTracking() 
       .Where(p => p.StatusId == 1).ToList(); 

Nếu tôi thay đổi phiên bản của MvcMiniProfiler.Data.ProfiledDbProvider trong Web.Config từ 1,8 .0.0 đến 1.9.0.0 Một loại ngoại lệ mới xảy ra trong cuộc gọi MiniProfilerEF.Initialize().

System.IndexOutOfRangeException was unhandled by user code 
    Message=The given DataRow is not in the current DataRowCollection. 
    Source=System.Data 
    StackTrace: 
     at System.Data.DataRowCollection.Remove(DataRow row) 
     at MvcMiniProfiler.MiniProfilerEF.Initialize() 

Trả lời

4

Check-out http://code.google.com/p/mvc-mini-profiler/

Dưới đây là một ví dụ về cách sử dụng MVC-mini-profiler với EF Cơ sở dữ liệu đầu tiên:

public static class Entities 
{ 
    public static MyEntities Create() 
    { 
     var builder = new EntityConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString); 
     var sqlConnection = new SqlConnection(builder.ProviderConnectionString); 
     var profiledConnection = new EFProfiledDbConnection(sqlConnection, MiniProfiler.Current); 

     return profiledConnection.CreateObjectContext<MyEntities>(); 
    } 
} 

Sau đó bạn có thể đăng ký các đối tượng của bạn với một container IOC sử dụng hoặc sử dụng cách khác như

using(var entities = Entities.Create()) 
{ 
    //Do stuff here 
    entities.SaveChanges(); 
} 

Chỉnh sửa: Quên o thêm

MiniProfilerEF.Initialize();

Chỉ được sử dụng cho mã EF trước tiên.

+0

+1 câu trả lời hữu ích - chỉ cần cố định một lỗi nhỏ trong 'Create' mẫu – BrokenGlass

+0

của bạn tôi đã cố gắng giải pháp của bạn nhưng bây giờ tôi nhận được một ngoại lệ như dưới đây System.NotSupportedException: Không thể xác định tên nhà cung cấp để kết nối loại 'MvcMiniProfiler.Data.EFProfiledDbConnection'. System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInvariantName (kết nối DbConnection) 613.588 System.Data.Entity.ModelConfiguration.Utilities.DbConnectionExtensions.GetProviderInfo (DbConnection kết nối, DbProviderManifest & providerManifest) 57 System.Data.Entity. DbModelBuilder.Build (DbConnection providerConnection) +159 – Yucel

+0

Hey Yucel, bạn cần Entity Framework được cài đặt/tham chiếu trong dự án của bạn và bổ sung cho MvcMiniProfiler-bạn cũng cần gói Entity Framework. EntityConnectionStringBuilder sẽ phân tích cú pháp chuỗi kết nối Entity Framework với siêu dữ liệu cụ thể EF. ProviderConnectionString là cái mà chúng ta quen thuộc (tên, nhà cung cấp connectionString +). Nội bộ trong ADO.NET có một nhà máy với các nhà cung cấp đã đăng ký để khởi tạo nhà cung cấp chính xác dựa trên thuộc tính của nhà cung cấp trong chuỗi kết nối. Ví dụ, kết nối MSSQL thường sử dụng nhà cung cấp SqlClient. – Shelakel

6

Có thể điều này sẽ hữu ích. Di chuyển số MiniProfilerEF.Initialize(); lên trên cùng của phương thức Application_Start(). Lưu ý rằng trong EF 4.1 và cao hơn, phương thức được gọi là MiniProfilerEF.Initialize_EF42();.

protected void Application_Start() { 
    Logger.Info("Application start"); 
    MiniProfilerEF.Initialize_EF42(); 
    // ... 
} 
Các vấn đề liên quan