我们目前正在使用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
任何想法?
答案 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()));
}