实体框架与mysql,linux和windows之间的表资本化问题

时间:2012-02-25 16:15:14

标签: mysql sql entity-framework

我们目前正在使用Code First Entity Framework和Mysql开发产品。开发数据库托管在Windows环境中,而生产mysql在Linux上。

我遇到的问题是mysql中的表命名如下:

 mydatabase.industry
 mydatabase.account
 ...

实体框架创建如下查询:

  Select * FROM mydatabase.Industry;

注意大写字母。这适用于Windows中的mysql,但在Linux上我收到此错误:

  Table 'mydatabase.Industry' doesn't exist

任何想法?

4 个答案:

答案 0 :(得分:7)

实体框架将使用与为对象声明的相同名称(大小写等)。因此,例如,如果您将模型对象声明为:

public class Industry
{
  public int IndustryID { get; set; }
}

实体框架将查找具有IndustryID列的Industry表。

您可以通过向模型添加注释来更改此设置。执行以下操作:

[Table("industry")]
public class Industry
{
  public int IndustryID { get; set; }
}

通过执行此操作,您的对象仍将使用适当的.NET命名方案,但它将与您的相应数据库匹配。您还可以使用ColumnAttribute更改colunns的名称。

或者,您可以更改MySQL中的表名。

答案 1 :(得分:3)

  

实体框架创建如下查询:

     

选择* FROM mydatabase.Industry;注意大写字母。   这适用于Windows中的mysql,但在Linux上我收到此错误:

     

表'mydatabase.Industry'不存在任何想法?

这与实体框架本身无关 它是两种不同操作系统问题的经典不同默认配置的变体。

可能不再需要解决方案了,但这就是您遇到问题的原因:

MySQL将表存储为文件 MySQL最初是在Linux上开发的,其中文件名和表名都区分大小写(因为大多数Linux文件系统都区分大小写)。

然后MySQL被移植到Windows,其中文件系统不区分大小写。
在Windows上,文件系统不区分大小写,因此无法区分低级和大写文件。
要解决由此产生的问题,需要添加选项以忽略表名的大小写。

因此创建了标识符case-senstivity配置变量“lower_case_table_names”,可以使用它来切换这些设置。

有关可能值[0,1,2]的更多信息,请点击此处: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

在Windows上,您可以在my.ini文件中配置它,可在以下位置找到:

C:\Program Files\MySQL\MySQL Server X.Y

,具体取决于您运行的版本。 如果找不到该设置,只需将其添加到my.ini文件的末尾即可。

在Linux上,此配置文件通常位于 /etc/my.cnf中 要么 /etc/mysql/my.cnf 但这可能因各种Linux-dristribution和发行版本而异。

因此该值的默认值为

on Linux: Case-Senstivie
on Windows: Case-Insensitive

因此,实体框架生成的SQL是从具有错误外壳的模型生成的,适用于Windows,但不适用于Linux。

您需要做的就是将my.cnf文件中Linux上的lower_case_table_names的值更改为1,以便它也不区分大小写。

请注意,虽然您也可以使Windows上的MySQL区分大小写,但这不是一个好主意。

然后,在测试它是否有效之前,请记住重新启动MySQL服务/ mysqld。

在所有情况下,请始终记住检查它是否也适用于Linux,因为MySQL的行为在这两个系统上并不总是相同。

不同默认值的原因是,在Linux上,当您处于区分大小写模式时,您可以获得更高的性能,因为这样您就不必总是使用小写名称。 另一方面,在Windows上,使用不区分大小写的配置会更好,因为您不能拥有两个具有相同名称的文件,这些文件只在同一文件夹中的大小写不同。这会导致故障。因此,Windows上的默认值不区分大小写。

从本质上讲,这就是为什么Linux在Linux上的性能优于Windows上的性能(除了其他方面,比如在Linux上更好的调度和更快的IO /文件系统)

请注意,您还可以通过执行

来更改查询的大小写敏感度(字符串比较)
CREATE DATABASE test_database CHARACTER SET utf8 COLLATE utf8_general_cs;

CREATE DATABASE test_database CHARACTER SET utf8 COLLATE utf8_general_ci;
分别

您还可以在单​​个表上设置区分大小写,例如

DROP TABLE IF EXISTS single_test_table;
CREATE TABLE single_test_table(
  single_test_id int unsigned NOT NULL auto_increment,
  ...

  PRIMARY KEY PK_single_test_id (single_test_id ),
  ...
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE utf8_general_cs;

答案 2 :(得分:1)

以下是我对评论的回答:

usr:为什么不将配置的表名更改为小写?该  SQL表名和实体名是可独立配置的。

AFrieze:你的意思是将实体名称改为小写吗?所以与其  一个C#类“工业”我会有一个“工业”类?

usr:不,两者不同。您可以将表名xyz映射到  实体Abc。 - 我们刚刚编辑

答案 3 :(得分:1)

使用EF6:

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Types().Configure(entity => entity.ToTable(entity.ClrType.Name.ToLower()));
    }