2016-11-20 66 views
5

我發現此link可使full-text search工作通過linq。但是,代碼似乎是針對database first approach。如何使它與Database First Approach一起工作?的代碼EF6:使用數據庫優先方法進行全文搜索

有關部分:

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()); 
    } 
} 

如所看到的功能OnModelCreating以上內容僅稱爲Code First Approach。我想知道需要改變什麼來使代碼在鏈接工作Database First方法

+0

如果您使用「EF反向POCO」模板生成代碼ISO EDMX – ErikEJ

+0

@ErikEJ,它可以在「數據庫優先」中正常工作您可以稍微詳細解釋一下,以及是否有辦法使其工作不需要太多修改代碼。 –

+2

您是否真的嘗試爲您的案例運行該代碼?對於鏈接中描述的代碼,數據庫優先或使用模型優先方法無關緊要。是的,OnModelCreating不是首先在數據庫中調用的,但它也與以任何方式實現全文搜索無關。重要的是FtsInterceptor。 – Evk

回答

1

好吧,我嘗試沒有OnModelCreating實施解決方案完全與事實證明,這是因爲@Evk建議,甚至不需要FullText攔截器實現。

1

我建議不同的方法。在SQL服務器上使用全文搜索創建表值函數,並使用參數從實體框架中調用它。從我的項目,它的搜索全文超過兩個表,可以從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

如果我嘗試使用表值函數,面對此[問題](http://stackoverflow.com/questions/40686625/sql-nested-query-does-not-have-never-key) –

1

數據庫,首先生成的所有類的諧音,包括非常有用的部分OnContextCreated方法。

我不能在此刻測試它,但你可以嘗試添加MyContext_FTS.cs文件,下面的代碼:

public partial class MyContext 
{ 
    partial void OnContextCreated() 
    {   
      DbInterception.Add(new FtsInterceptor()); 
    } 
}