如何使用MySql和Entity Framework 4.2 Code First进行全文搜索?

时间:2012-08-19 22:41:18

标签: mysql entity-framework-4 full-text-search

我正在使用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`);

我能想到的一个可能性是:

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。

我能想到的一个不那么理想的可能性是创建一个存储过程(同样,使用ExecuteSqlCommand),它接受一个字符串并返回匹配的PatientID列表或Patient行列表。例如:

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)]属性,我的字符串仍然存储为MEDIUMTEXT而不是VARCHAR(50),正如我所料。如果没有[MaxLength]属性,我会得到LONGTEXT。如何为字符串类型指定VARCHAR(n)?

有什么想法吗?

提前致谢,

2 个答案:

答案 0 :(得分:1)

  1. 它是特定于提供者的,所以除非你的MySQL提供者提供某种方法来改变它,否则你将无法从代码中做到这一点。我认为您应该能够在自定义数据库初始化程序中运行ALTER TABLE来更改引擎。
  2. 如果您使用迁移功能(EF 4.3及更高版本),则可以在迁移中编写索引脚本,否则您需要使用初始化程序。
  3. 您需要使用SQL查询数据库。 EF不支持全文搜索查询。要调用存储过程,必须使用SqlQuery并填充与结果集具有相同属性的类型。
  4. 尝试使用[Column(TypeName="VARCHAR(50)]注释。

答案 1 :(得分:0)

如果您是MySQL用户的dotConnect,我们建议您查看 this article。如果您使用其他提供商,我们建议您与其供应商联系。