EF6:使用数据库优先方法进行全文搜索

5
我发现了这个链接,可以通过linq实现全文搜索。然而,代码似乎是针对数据库优先方法编写的。如何使它与数据库优先方法一起工作?
代码的相关部分:
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方法。

如果您使用“EF Reverse POCO”模板进行代码生成而不是EDMX,则在“数据库优先”中它将正常工作。 - ErikEJ
@ErikEJ 能否稍微详细解释一下,同时是否有不需要太多代码修改就能使其工作的方法。 - Shyamal Parikh
2
你确实尝试运行了针对你案例的代码吗?对于你链接中描述的代码,使用数据库优先还是模型优先方法并不重要。是的,在数据库优先的情况下不会调用OnModelCreating,但这与以任何方式实现全文搜索也无关。 FtsInterceptor才是最重要的。 - Evk
3个回答

1

好的,我尝试实现了没有使用OnModelCreating的解决方案,结果发现对于FullText拦截器的实现,就像@Evk建议的那样,它甚至不需要。


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)

如果我尝试使用表值函数,会遇到这个问题 - Shyamal Parikh

1
Database-first 会生成所有类作为 partial 类,包括非常方便的 partial OnContextCreated 方法。
我目前无法测试它,但您可以尝试添加一个名为 MyContext_FTS.cs 的文件,并使用以下代码:
public partial class MyContext
{
    partial void OnContextCreated()
    {         
          DbInterception.Add(new FtsInterceptor());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接