2016-11-20 8 views
5

linkfull-text searchlinqになります。ただし、コードはdatabase first approachをターゲティングしているようです。 Database First Approachと連携させるにはどうすればいいですか?EF6:データベースを使用した全文検索First approach

コードの関連部分:機能OnModelCreating上に見られるよう

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

のみCode First Approachで呼び出されます。 Database Firstへのリンク作業でコードを変更する必要があるのだろうか?

+0

コード生成iso EDMX – ErikEJ

+0

@ErikEJの "EF Reverse POCO"テンプレートを使用すると、 "Database first"で正常に動作します。もう少し詳細に説明してもらうことができますか?コードの変更。 –

+2

実際にそのコードを実行しようとしましたか?あなたのリンクに記述されているコードについては、まずデータベースに関係なく、モデルの最初のアプローチが使用されます。はい、OnModelCreatingはデータベースでは最初に呼び出されませんが、どのような方法でもフルテキスト検索を実装することとは関係ありません。重要なことはすべてFtsInterceptorです。 – Evk

答えて

1

[OK]を、私は完全にOnModelCreatingせずにソリューションを実装しようと、それはそれがあることが判明します@Evkが示唆しているように、FullTextインターセプタの実装には必要ありません。

1

私は別のアプローチを提案します。 SQLサーバー上でフルテキスト検索を使用してテーブル値関数を作成し、パラメータを使用してEntity Frameworkから呼び出します。二つのテーブルの上に私のプロジェクトの検索全文から簡略化した例と簡単に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-appropriate-key) –

1

データベース、最初は非常に便利な部分OnContextCreated方法を含むパーシャルとしてすべてのクラスを生成します。

私は、現時点ではそれをテストすることはできませんが、あなたはMyContext_FTS.csは、次のコードでファイルを追加してみてください:

public partial class MyContext 
{ 
    partial void OnContextCreated() 
    {   
      DbInterception.Add(new FtsInterceptor()); 
    } 
} 
関連する問題