【发布时间】:2016-01-13 04:48:19
【问题描述】:
我有一个具有现有数据库结构和数据的项目。目前项目正在 PHP + MySQL 上运行,我正在尝试从 PHP 切换到 C# EF 6.0 + MySQL 数据库优先方法。
我已经安装了 NuGet 包(EF 6.0 和 MySQL.Data、MySQL.Web、MySQL.Data.Entity、MySQL.Data.Entities)并根据使用的 MySQL 数据提供程序修改了我的 app.config。到目前为止,一切正常,我可以从数据库生成模型,并且可以在每个表上插入数据而没有任何问题,但多对多关系表。我创建了 2 个名为 TableA 和 TableB 的虚拟表以及关系表 TableA_TableB 以请求有关我的问题的帮助。
到目前为止,一切看起来都很好,但正如我在尝试插入 TableA 和 TableB 之间的关系时提到的那样,它失败了。您可以在下面看到我的 C# 代码:
public static void Create()
{
using (MainDataContext mainDataContext = new MainDataContext())
{
try {
mainDataContext.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
TableA tableA = new TableA();
tableA.Title = "My Title";
tableA.Description = "MyDescription";
mainDataContext.TableA.Add(tableA);
mainDataContext.SaveChanges();
TableB tableB = new TableB();
tableB.Title = "Table B Title";
tableB.Description = "Table B Description";
mainDataContext.TableB.Add(tableB);
mainDataContext.SaveChanges();
tableA.TableB.Add(tableB);
mainDataContext.SaveChanges();
}
catch (Exception ex)
{
}
}
}
mainDataContext.SaveChanges()的前两个;工作正常,但最后一个 mainDataContext.SaveChanges();抛出关于我表的 FK 的异常(我尝试了单个事务,它也失败了),但是在我挖掘调试输出之后,我遇到了异常的真正原因。我在我的数据上下文中打开了调试输出,在这里您可以看到 EF 的插入语句的输出,您可以在下面看到它:
在 11.1.2016 23:30:46 +02:00 打开连接 11.1.2016 23:30:46 +02:00 开始交易
SET SESSION sql_mode='ANSI';INSERT INTO
TableA(Title,Description) 价值观 ( @gp1, @gp2); 选择ID来自TableAWHERE row_count() > 0 ANDID=last_insert_id() -- @gp1:“我的标题”(类型 = 字符串,IsNullable = false,大小 = 8) --@gp2:'MyDescription'(类型 = 字符串,IsNullable = 假,大小 = 13) -- 执行于 11.1.2016 23:30:47 +02:00 -- 在 1 毫秒内完成,结果为:EFMySqlDataReader在 11.1.2016 23:30:47 +02:00 提交的交易 11.1.2016 23:30:47 +02:00 关闭连接 交易于 11.1.2016 23:30:47 +02:00 处理 于 11.1.2016 23:30:55 +02:00 打开连接 开始交易于 11.1.2016 23:30:55 +02:00
SET SESSION sql_mode='ANSI';INSERT INTO
TableB(Title,Description) 价值观 ( @gp1, @gp2); 选择ID来自TableBWHERE row_count() > 0 ANDID=last_insert_id()-- @gp1:“表 B 标题”(类型 = 字符串,IsNullable = false,大小 = 13) --@gp2:“表 B 描述”(类型 = 字符串,IsNullable = false,大小 = 19) -- 执行于 11.1.2016 23:30:55 +02:00 -- 在 6 毫秒内完成,结果为:EFMySqlDataReader
在 11.1.2016 23:30:55 +02:00 提交的交易 11.1.2016 23:30:55 +02:00 关闭连接 已于 11.1.2016 23:30:55 +02:00 处置交易 在 11.1.2016 23:30:58 +02:00 打开连接 11.1.2016 23:30:58 +02:00 开始交易
插入(选择
TableA_TableB.TableAID,TableA_TableB.TableBIDFROMTableA_TableBASTableA_TableB)(TableAID,TableBID) 价值观 ( 1、 1)-- 执行于 11.1.2016 23:30:58 +02:00
-- 在 3 毫秒内失败并出现错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '(SELECT
TableA_TableB.TableAID,TableA_TableB.TableBIDFROM `TableA_Tab' 第 1 行11.1.2016 23:30:58 +02:00 关闭连接 交易于 11.1.2016 23:30:58 +02:00 处理 抛出异常:EntityFramework.dll 中的“System.Data.Entity.Infrastructure.DbUpdateException”
下面还有我表的 DDL:
CREATE TABLE `TableA` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`Description` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `TableB` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`Description` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `TableA_TableB` (
`TableAID` int(10) unsigned NOT NULL,
`TableBID` int(10) unsigned NOT NULL,
KEY `TableA_TableB_TableAID` (`TableAID`),
KEY `TableA_TableB_TableBID` (`TableBID`),
CONSTRAINT `TableA_TableB_TableAID` FOREIGN KEY (`TableAID`) REFERENCES `TableA` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `TableA_TableB_TableBID` FOREIGN KEY (`TableBID`) REFERENCES `TableB` (`ID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我想知道这是一个错误还是我做错了什么有人知道我的问题吗?
提前致谢!
【问题讨论】:
标签: c# mysql entity-framework-4 entity-framework-6 ef-database-first