2011-12-29 19 views
7

Không thể truyền đối tượng thuộc loại 'MvcMiniProfiler.Data.EFProfiledDbConnection' để nhập 'System.Data.SqlClient. SqlConnection '.Không thể truyền đối tượng thuộc loại 'MvcMiniProfiler.Data.EFProfiledDbConnection' để nhập 'System.Data.SqlClient.SqlConnection'

Tôi đang cố gắng nâng cấp lên MvcMiniProfiler 1.9.0 và tôi tiếp tục nhận được điều này khi tôi gọi MiniProfilerEF.Initialize(). Tôi đã gỡ bỏ phần cấu hình system.data. Tôi không biết mình đang làm gì sai. Tôi đã làm theo các bước trên trang web, nhưng có lẽ tôi đã bỏ lỡ điều gì đó?

Tôi đang sử dụng mã EF đầu tiên 4.1 và tôi chuyển tên chuỗi kết nối của tôi vào một hàm tạo để tạo văn bản dữ liệu của tôi.

Web Activator

using Project.Web.App_Start; 
using WebActivator; 

[assembly: PreApplicationStartMethod(typeof(MiniProfiler), "Start")] 

namespace Project.Web.App_Start { 
    public class MiniProfiler { 
     public static void Start() 
     { 
      if (Eco.Environment.IsDevelopment) { 
       MiniProfilerEF.Initialize(); 
      } 
     } 
    } 
} 

StructureMap Registry:

using Project.Domain.Repositories; 
using StructureMap.Configuration.DSL; 

namespace Project.Web.DependencyResolution.Registries { 
public class RepositoriesRegistry : Registry { 
    public RepositoriesRegistry() { 
     For<IProjectDataContext>().HybridHttpOrThreadLocalScoped().Use(() => new ProjectDataContext(Eco.Database.Name)); 
      } 
    } 
} 

DataContext vị thi công:

public ProjectDataContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) { 
     Active = new Active(this); 
    } 

Tôi đã gỡ bỏ dataproviders system.data fron cấu hình của tôi kể từ khi tài liệu nói rằng tôi chỉ cần để gọi MiniProfilerEF.Initialize().

** Update

Trước đây trong 1,7 MvcMiniProfiler tôi phải thiết lập thuộc tính Database.DefaultConnectionFactory, nhưng tôi đã gỡ bỏ đó. Database.DefaultConnectionFactory luôn quay trở lại như là SqlConnectionFactory, không phải là ProfiledConnectionFactory hay cái gì đó như thế?

+0

Bạn có thể cung cấp mã + tệp cấu hình không? Thông thường, bạn xác định chuỗi kết nối trong tệp cấu hình có cùng tên với lớp DBContext của bạn và bạn không bao giờ cần phải sử dụng một hàm tạo không mặc định. – Tejs

+0

Iirc có thiết lập mẫu EF trên nuget. Nhưng: tôi có thể hỏi: bạn có luôn cho nó một kết nối định hình không? Hoặc đôi khi bạn (có lẽ tùy thuộc vào người dùng) sử dụng một kết nối hồ sơ, và đôi khi sử dụng một kết nối SQL thường? –

+0

@MarcGravell Tôi đã làm điều này với phiên bản 1.7. Tôi sẽ chuyển từ một kết nối profiled (Debug) để kết nối sql trong (Release). Nó hoạt động tốt. –

Trả lời

0

Vấn đề tôi thấy ở đây, là ProjectDataContext đóng gói một số bối cảnh dữ liệu vào thuộc tính "Hoạt động", mà không thể tìm thấy bằng proxy MvcProfiler.

Hơn thế nữa, EFProfiledDbConnection thực sự là con của DbConnection, chứ không phải con của SqlConnection. Nó được thực hiện theo cách trừu tượng để sử dụng các nhà cung cấp Db khác nhau, như MySql, Postgres, v.v. Hãy thử xem lại tất cả các biến trong mã, chúng nên là DbConnection, nhưng không phải SqlConnection (đây là nhà cung cấp MsSql).

2

Tôi đã gặp lỗi tương tự này. Nó khiến tôi khốn khổ nhưng cuối cùng tôi đã tìm ra. Vấn đề của tôi không liên quan gì đến web.config, hội đồng, Initialize_42 hoặc Initialize(false) hack hoặc bất kỳ thứ gì.

Đây là nơi tôi đã đi sai ...

tôi đã kích hoạt ứng dụng tự động di cư như thế này:

App_Start:

Database.SetInitializer(
    new MigrateDatabaseToLatestVersion<DataContext, Migrations.Configuration>() 
); 

Migrations/Configuration.cs:

internal sealed class Configuration 
    : DbMigrationsConfiguration<Path.To.DataContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 
} 

Và điều đó đã được kích hoạt qua WebActivator như sau:

[assembly: WebActivator.PreApplicationStartMethod(
    typeof(service_tracker_mvc.App_Start.DatabaseInitializer), "Start")] 

Tôi vô tình nhận thấy rằng việc vô hiệu hóa quá trình này dẫn đến hoạt động của hồ sơ. Vấn đề, như nó xảy ra, là quá trình init này đã xảy ra quá sớm.Nó thường xảy ra trong thời gian Application_Start (nếu bạn không sử dụng công cụ ưa thích WebActivator này) vì vậy tôi đã thay đổi nó thành PostStart. Bây giờ nó hoạt động:

     ▼▼▼▼ 
[assembly: WebActivator.PostApplicationStartMethod(
    typeof(service_tracker_mvc.App_Start.DatabaseInitializer), "Start")] 
0

Tôi đã có cùng một vấn đề này và cách tôi tìm thấy để sửa chữa nó là di chuyển đến Glimpse: http://getglimpse.com/. Theo ý kiến ​​của tôi, nó là tốt hơn rất nhiều so với miniprofiler, dễ sử dụng, đầy đủ vv

1

thấy https://stackoverflow.com/a/10814033/311289

này được gây ra bằng cách làm các hoạt động DB trước khi khởi miniprofiler, đặt một breakpoint trong contstructor cho db của bạn ngữ cảnh và một đoạn khác trên dòng MiniProfilerEF.Initialize(); và sửa đổi cho đến khi khởi tạo trước tiên.

2

Tôi đã nhầm lẫn khi thêm MiniProfiler.EF thay vì MiniProfiler.EF6. Loại bỏ MiniProfiler.EF và thay thế nó bằng phiên bản EF6 đã khắc phục được sự cố của tôi.

+0

Cảm ơn bạn Sam, điều này đã lưu tôi. – Bassie

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