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`);

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

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)?

有任何想法吗?

提前致谢,

4

2 回答 2

1
  1. 它是特定于提供者的,因此除非您的 MySQL 提供者提供某种更改它的方法,否则您将无法首先从代码中做到这一点。我认为您应该能够ALTER TABLE在自定义数据库初始化程序中运行以更改引擎。
  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 回答