2

Entity Framework 4.2 Code First と MySQL を使用しています。テーブルのいくつかのフィールドで全文検索を実行できるようにする必要があります。ただし、これにはいくつかの問題があります。

1) MySQL での全文検索には、MyISAM テーブル タイプが必要です。ただし、DropCreateDatabaseAlways イニシャライザを実行すると、得られるテーブル タイプは InnoDB になります。これが私のテーブル定義の例です:

[Table("Patient")]
[Serializable]
public class Patient
{
    public Patient()
    {
    }

    [Key]
    public int PatientID { get; set; }

    [MaxLength(50)]
    public string FirstName { get; set; }
    [MaxLength(50)]
    public string LastName { get; set; }
}

MyISAM テーブルタイプを指定することはできますか? もしそうなら、どのように?

2) 全文索引を指定する必要があります。

ALTER TABLE `patient` ADD FULLTEXT INDEX `Name`(`FirstName`, `LastName`);

私が考えることができる1つの可能性は次のとおりです。

public class MyDbInitializer : DropCreateDatabaseAlways<MyDbContext>
{
    protected override void Seed(MyDbContext context)
    {
        context.Database.ExecuteSqlCommand(
            "ALTER TABLE `patient` ADD FULLTEXT INDEX `Name`(`FirstName`, `LastName`)");
    }
}

より良い方法はありますか?

3) 全文索引を使用して検索できるようにする必要があります。理想的には、既存の linq to SQL と連携する方法で。

私が考えることができる 1 つのあまり望ましくない可能性は、文字列を受け取り、一致する患者 ID のリストまたは患者の行のリストのいずれかを返すストアド プロシージャを (ここでも ExecuteSqlCommand を使用して) 作成することです。例えば:

IEnumerable<int> patientIDs = [...call stored proc to get matching ids...]
var patients = from p in patients 
               where patientIDs.Any(pid => pid == p.PatientID) 
               select new {...}

または:

var patients = from p in [...call stored proc to get matching patient records...]
               select new {...}

どうすればいいですか?より良い方法はありますか?

4) おまけの質問: [MaxLength(50)] 属性を指定しても、予想どおり、文字列は VARCHAR(50) ではなく MEDIUMTEXT として保存されます。[MaxLength] 属性がないと、LONGTEXT になります。文字列型に VARCHAR(n) を指定するにはどうすればよいですか?

何か案は?

前もって感謝します、

ダン

4

2 に答える 2

1
  1. これはプロバイダー固有であるため、MySQL のプロバイダーが変更する方法を提供しない限り、最初にコードから変更することはできません。ALTER TABLEエンジンを変更するには、カスタム DB イニシャライザーで実行できるはずです。
  2. 移行機能 (EF 4.3 以降) を使用する場合は、移行でインデックスをスクリプト化できます。それ以外の場合は、初期化子を使用する必要があります。
  3. SQL を使用してデータベースにクエリを実行する必要があります。EF は全文検索クエリをサポートしていません。ストアド プロシージャを呼び出すにはSqlQuery、結果セットと同じプロパティを持つ型を使用して設定する必要があります。
  4. [Column(TypeName="VARCHAR(50)]アノテーションを使用してみてください。
于 2012-08-20T08:50:45.880 に答える
0

dotConnect for MySQLユーザーの場合は、この記事を参照することをお勧めします。他のプロバイダーを使用する場合は、そのベンダーに連絡することをお勧めします。

于 2012-08-21T06:48:59.147 に答える