12

TLDR; Làm cách nào để bạn thêm chỉ mục văn bản đầy đủ bằng cách sử dụng Entity framework 5 di chuyển được mã hóaTạo chỉ mục toàn văn trong khung Entity Migrated Migrated

Tôi đang gặp sự cố khi thêm chỉ mục văn bản đầy đủ vào cơ sở dữ liệu bằng cách sử dụng di chuyển khung Entity. Nó cần phải có ngay từ đầu vì vậy tôi đang cố gắng sửa đổi di chuyển InitialCreate được tạo tự động để thêm nó.

Vì không có cách nào để làm điều đó thông qua API DbMigrations tôi đã sử dụng để chạy sql nội tuyến ở cuối mã 'Lên'.

Sql("create fulltext catalog AppNameCatalog;"); 
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;"); 

Khi điều này chạy tất cả mọi thứ được tạo ra tốt đẹp cho đến khi nó đạt đến sql này, sau đó nó ném lỗi sql 'CREATE tuyên bố toàn văn DANH MỤC không thể được sử dụng bên trong một giao dịch người dùng. '. Đó là dự kiến ​​và làm việc như thiết kế.

Rất may Sql() có quá tải cho phép bạn chạy sql bên ngoài giao dịch di chuyển. Tuyệt vời! Tôi đã nghĩ.

Sql("create fulltext catalog AppNameCatalog;", true); 
Sql("create fulltext index on Document (Data type column Extension) key index [PK_dbo.Document] on AppNameCatalog;", true); 

Nhưng thấp và behold sửa đổi mã để làm điều này (xem ở trên) kết quả trong một lỗi timeout mới 'Timeout hết hạn. Khoảng thời gian chờ trôi qua trước khi hoàn thành thao tác hoặc máy chủ không phản hồi. '

Tôi đã thử loại bỏ sql và chạy nó theo cách thủ công và hoạt động tốt. Tôi cũng diff'd sql được tạo ra có và không có nó chạy bên ngoài một giao dịch và họ là giống hệt nhau vì vậy nó phải là một cái gì đó trong cách sql được thực hiện.

Cảm ơn bạn đã giúp đỡ!

Trả lời

7

Tôi gặp sự cố tương tự. Di chuyển InitialCreate của tôi đã tạo ra một bảng và sau đó cố thêm một chỉ mục văn bản đầy đủ vào bảng đó, sử dụng Sql() quá tải để chỉ ra rằng nó cần thực thi bên ngoài giao dịch. Tôi cũng nhận được một lỗi thời gian chờ và tôi nghi ngờ đó là do một bế tắc thread.

Tôi có thể làm cho nó hoạt động trong một số trường hợp bằng cách sử dụng các cuộc gọi Sql() thay vì CreateTable() và bằng cách kết hợp TẠO ĐẦY ĐỦ TEXT và tạo các câu lệnh INDEX toàn văn bản vào một lệnh Sql() duy nhất. Tuy nhiên, điều này không đáng tin cậy lắm. Đôi khi nó sẽ làm việc và đôi khi nó sẽ thất bại với cùng một lỗi timeout.

Giải pháp đáng tin cậy duy nhất tôi tìm thấy là di chuyển việc tạo danh mục và chỉ mục văn bản đầy đủ thành một di chuyển riêng biệt.

+0

Xin chào, cảm ơn bạn đã nhập liệu. Nó có hoạt động như một sự chuyển đổi riêng biệt không? –

+1

Yip, tôi có nó hoạt động như một di chuyển riêng biệt. Việc tạo bảng xảy ra trong quá trình di chuyển InitialCreate và Danh mục toàn văn và các chỉ mục được tạo trong một di chuyển riêng biệt được dự định sẽ được thực hiện sau khi di chuyển InitialCreate. – jspaey

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