我使用的是实体框架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的列表或患者行的列表。例如:
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)?
有什么想法吗?
提前谢谢你,
丹
发布于 2012-08-20 16:50:46
ALTER TABLE来改变引擎。SqlQuery并使用与结果集相同的属性填充类型。[Column(TypeName="VARCHAR(50)]批注。发布于 2012-08-21 14:48:59
如果你是MySQL的dotConnect用户,我们建议你去看看 this article。如果您使用其他提供商,我们建议您与其供应商联系。
https://stackoverflow.com/questions/12030555
复制相似问题