【问题标题】:EF6: Full-text Search with Database First ApproachEF6:使用数据库优先方法的全文搜索
【发布时间】:2016-11-30 14:40:55
【问题描述】:

我发现这个link 是为了让full-text search 通过linq 工作。但是,该代码似乎针对database first approach。如何使它与Database First Approach 一起工作?

相关部分代码:

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”模板进行代码生成iso EDMX,它将在“数据库优先”中正常工作
  • @ErikEJ 你能解释得更详细一点吗?是否有办法让它在不修改代码的情况下工作。
  • 您是否真的尝试为您的案例运行该代码?对于链接中描述的代码,使用数据库优先或模型优先方法并不重要。是的,OnModelCreating 不会首先在数据库中调用,但它也与以任何方式实现全文搜索无关。重要的是 FtsInterceptor。

标签: c# entity-framework linq


【解决方案1】:

我建议不同的方法。在 SQL Server 上创建具有全文搜索的表值函数,并从实体框架中使用参数调用它。我的项目中的简化示例,它在两个表上搜索全文并且可以从 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)

【讨论】:

  • 如果我尝试使用表值函数,面对这个issue
【解决方案2】:

数据库优先将所有类生成为部分,包括非常方便的部分OnContextCreated 方法。

目前我无法测试,但您可以尝试使用以下代码添加 MyContext_FTS.cs 文件:

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

【讨论】:

    【解决方案3】:

    好的,我尝试完全不使用OnModelCreating 来实现解决方案,结果发现@Evk 建议的FullText 拦截器实现甚至不需要它。

    【讨论】:

      猜你喜欢
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多