2016-11-20 20 views
5

Tôi tìm thấy số này link để làm cho full-text search hoạt động qua linq. Tuy nhiên, mã dường như đang nhắm mục tiêu database first approach. Cách làm cho nó hoạt động với Database First Approach?EF6: Tìm kiếm toàn văn với cơ sở dữ liệu Phương pháp tiếp cận đầu tiên

phần có liên quan của mã:

public class NoteMap : EntityTypeConfiguration<Note> 
{ 
    public NoteMap() 
    { 
     // Primary Key 
     HasKey(t => t.Id); 
    } 
} 
public class MyContext : DbContext 
{ 
    static MyContext() 
    { 
     DbInterception.Add(new FtsInterceptor()); 
    } 
    public MyContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
    } 
    public DbSet<Note> Notes { get; set; } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new NoteMap()); 
    } 
} 

Như đã thấy ở trên chức năng OnModelCreating chỉ được gọi trong Code First Approach. Tôi tự hỏi điều gì cần thay đổi để làm cho mã trong liên kết hoạt động theo cách tiếp cận Database First

+0

Nó sẽ hoạt động tốt trong "Cơ sở dữ liệu đầu tiên" nếu bạn sử dụng mẫu "EF Reverse POCO" để tạo mã iso EDMX – ErikEJ

+0

@ErikEJ Bạn có thể giải thích chi tiết hơn một chút không và nếu có cách nào làm cho nó hoạt động tốt sửa đổi trong mã. –

+2

Bạn có thực sự cố gắng chạy mã đó cho trường hợp của mình không? Đối với mã được mô tả tại liên kết của bạn, nó không quan trọng đầu tiên của cơ sở dữ liệu hoặc phương pháp tiếp cận mô hình đầu tiên được sử dụng. Có, OnModelCreating không được gọi trong cơ sở dữ liệu trước, nhưng nó cũng không liên quan đến việc thực hiện tìm kiếm toàn văn bản theo bất kỳ cách nào. Tất cả những gì quan trọng là FtsInterceptor. – Evk

Trả lời

1

Ok, tôi đã cố gắng thực hiện các giải pháp mà không OnModelCreating hoàn toàn và nó quay ra rằng nó là thậm chí không cần thiết cho việc thực hiện máy bay đánh chặn FullText như @Evk đề xuất.

1

Tôi đề xuất cách tiếp cận khác nhau. Tạo hàm có giá trị bảng với tìm kiếm toàn văn trên máy chủ SQL và gọi nó từ Entity Framework với tham số. ví dụ đơn giản từ dự án của tôi mà tìm kiếm toàn văn trên hai bảng và có thể dễ dàng gọi từ EF:

CREATE FUNCTION [dbo].[GetRealtyMapFulltext] 
(@criteria nvarchar(4000)) 
RETURNS TABLE 
AS 
RETURN (SELECT 
    realty.Id AS realtyId, 
    (COALESCE(ftR.Rank,0) + COALESCE(ftObec.Rank,0)) AS FtRank 
    FROM realty 
    LEFT JOIN ruian_obec ON realty.obecId = ruian_obec.obec_kod 
    Left JOIN CONTAINSTABLE(Realty, *, @criteria) ftR ON realty.Id = ftR.[Key] 
    Left JOIN CONTAINSTABLE(ruian_obec, *, @criteria) ftObec ON realty.obecId = ftObec.[Key] 
    AND (COALESCE(ftR.Rank,0) + COALESCE(ftObec.Rank,0) > 0) 
+0

Đối mặt với [vấn đề này] (http://stackoverflow.com/questions/40686625/sql-nested-query-does-not-have-appropriate-key) nếu tôi cố gắng sử dụng các hàm có giá trị của bảng –

1

Cơ sở dữ liệu đầu tiên tạo ra tất cả các lớp học như partials bao gồm rất tiện dụng phương pháp phần OnContextCreated.

tôi không thể kiểm tra nó vào lúc này, nhưng bạn có thể thử thêm nộp MyContext_FTS.cs với đoạn mã sau:

public partial class MyContext 
{ 
    partial void OnContextCreated() 
    {   
      DbInterception.Add(new FtsInterceptor()); 
    } 
} 
Các vấn đề liên quan