2016-11-20 68 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()); 
    } 
}