2012-08-16 35 views
19

Tôi đang di chuyển ứng dụng MVC 3 từ EF 4.3 sang EF 5. Tôi nhận thấy rằng EF 5 mong đợi một cột CreatedOn trong bảng __MigrationHistory, không tồn tại khi di chuyển được tạo ra bởi một phiên bản cũ hơn.Entity Framework 5 dự kiến ​​cột CreatedOn từ bảng MigrationHistory

SELECT TOP (1) 
[c].[CreatedOn] AS [CreatedOn] 
FROM [dbo].[__MigrationHistory] AS [c] 

Làm cách nào để giải quyết vấn đề này mà không xóa lịch sử di chuyển của tôi? Tôi đang nghĩ đến một truy vấn để suy ra giá trị của cột từ tên di cư, mà là ở định dạng sau:

201203111201542_MigrationName 
+0

này dường như là một cuộc xung đột với MiniProfiler: http://community.miniprofiler.com/permalinks/99/sqlexception-on-ef-5 -w-net-4-5 – CMircea

Trả lời

5

Cột CreatedOn không còn cần thiết. Chúng tôi cố gắng truy vấn từ nó để xác định xem chúng ta có cần thả nó hay không. tức là bạn đang nâng cấp từ 4.3 lên 5.

+7

Tôi không thấy cách này trả lời câu hỏi gốc - 'làm cách nào để tôi giải quyết ...' – Spongman

+5

@SpongeMan: Tôi đã nhận được ngoại lệ này, nhưng nó hóa ra tôi đã vô tình rời Visual Studio thiết lập để phá vỡ tất cả các trường hợp ngoại lệ, không chỉ là những cái chưa được giải quyết. Vì vậy, trong khi Andrew không nói rõ ràng, độ phân giải là tắt vi phạm các ngoại lệ đầu tiên. Debug-> Exceptions, sau đó bỏ chọn cột Thrown. – HiredMind

5

Có vẻ như một thứ trong Mã EF đầu tiên được kích hoạt khi di chuyển, khi bạn nâng cấp từ EF4. * lên EF 5.0. Và điều đó kết hợp với MiniProfiler. Bảng này tồn tại trong dbo._MigrationHistory trong các bảng hệ thống.

Bạn thử làm một vài điều:

  1. Bạn có thể thêm cột CreatedOn (DateTime) bằng tay để bàn dbo._MigrationHistory dưới thư mục bảng hệ thống.
  2. Bạn có thể ngừng phát hiện các thay đổi bằng cách đặt Configuration.AutoDetectChangesEnabled = false;
  3. Nhận xét dòng này MiniProfilerEF.Initialize(), vô hiệu hóa cấu hình EF.

Dưới đây là ví dụ về phương pháp hạt giống để thêm cột Đã tạo. Cột này sẽ bị xóa mỗi khi bối cảnh được khởi tạo. Phương thức hạt giống nằm trong lớp Cấu hình của ngữ cảnh.

internal sealed class Configuration : DbMigrationsConfiguration<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     // This method will be called after migrating to the latest version. 

     // Hide error Invalid column name 'CreatedOn' from mini profiler. 
     context.Database.ExecuteSqlCommand(
      @"IF NOT EXISTS(SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('__MigrationHistory') AND name = 'CreatedOn') 
       ALTER TABLE dbo.__MigrationHistory ADD CreatedOn datetime NOT NULL CONSTRAINT DF___MigrationHistory_CreatedOn DEFAULT (SYSUTCDATETIME()); 
     "); 
    } 
} 
+0

AutoDetectChanges = false không thực sự không giải quyết được vấn đề, nó cũng xảy ra với di chuyển "thủ công". Nhưng bạn, tất nhiên, chính xác với hai giải pháp còn lại. Cảm ơn. –

+0

hmmm tôi nghĩ rằng tôi đã thử nghiệm nó một cách chính xác: p cảm ơn bạn cho thông tin –

+0

Thêm một trường CreatedOn không hoạt động, bởi vì di chuyển tiếp theo sẽ thả nó ngay lập tức và nó sẽ bắt đầu lại từ đầu. –

6

Cũng giống như Filip Cornelissen đã nói, đó là điều giữa MiniProfiler.EF và Entity Framework 5.0.

Giải quyết/ẩn vấn đề thực sự dễ dàng hơn bạn nghĩ. Nó chỉ là một "vấn đề gỡ lỗi" vì lỗi bạn sẽ nhận được chỉ xảy ra trong thời gian instantiating (kiểm tra di chuyển mới), và lỗi là "SQL Unhandeld Exception".

Vì vậy, giải quyết vấn đề này thật dễ dàng:

Chuyển đến Visual Studio bằng tab "DEBUG". Nhấn mục "Ngoại lệ". Trong hộp thoại mới, bạn mở cây "Common Language Runtime Exceptions". Dưới "System.Data.SqlClient, bỏ chọn cả hai hộp kiểm sau 'System.Data.SqlClient.SqlException'. Thêm nó, nếu nó không phải là ở đó.

Và tắt ya đi!

+11

Nhưng điều này sẽ ngăn chặn tất cả SqlExceptions .. –

+2

Có nó sẽ. Nhưng theo như tôi biết, EF không ném (ngoại lệ) các ngoại lệ SQL. Vì vậy, nó là khá an toàn để bỏ qua những trường hợp ngoại lệ trong các dự án được hỗ trợ EF của bạn. –

4

Theo Filip Cornelissen câu trả lời tập lệnh sau khắc phục sự cố này

--IF OBJECT_ID('dbo.__MigrationHistory') IS NOT NULL 

ALTER TABLE dbo.__MigrationHistory ADD CreatedOn DateTime Default GETDATE() 
GO 
UPDATE dbo.__MigrationHistory SET CreatedOn = GETDATE() 
+5

Có, nhưng nó chỉ là tạm thời. Cột CreatedOn sẽ bị xóa một lần nữa! Chỉ là vấn đề thời gian thôi! –

3

Đây là cách giải quyết mà tôi đang sử dụng.Cá nhân, tôi là OK với cách nhấn vào mũi tên màu xanh lá cây hai lần (Bắt đầu gỡ lỗi và sau đó tiếp tục), nhưng nếu bạn thực sự muốn nó dừng lại phá vỡ, hãy thử this Post Xây dựng tổ chức sự kiện đó sẽ loại bỏ các MiniProfiler PDB:

del "$(TargetDir)MiniProfiler.pdb" /q /s 

CẬP NHẬT : nếu đó là quá nhiều công việc cho bạn, tôi đã tạo ra một NuGet package:

PM> Install-Package MiniProfilerContrib.EFMigrationsFix 
Các vấn đề liên quan