我有一個具有現有數據庫結構和數據的項目。目前項目運行在PHP + MySQL上,我試圖從PHP切換到C#EF 6.0 + MySQL數據庫第一種方法。實體框架(EF6)+ MySql數據庫第一個模型多對多關係錯誤查詢生成
我已經安裝了NuGet包(EF 6.0和MySQL.Data,MySQL.Web,MySQL.Data.Entity,MySQL.Data.Entities),並根據使用MySQL數據提供程序修改了我的app.config。在這種狀態下,一切正常,我可以從數據庫生成模型,並且可以在每個表上插入數據,而不會有任何問題,但是多對多的關係表。我創建了兩個名爲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的insert語句的輸出,你可以在下面看到它:
Opened connection at 11.1.2016 23:30:46 +02:00 Started transaction at 11.1.2016 23:30:46 +02:00
SET SESSION sql_mode='ANSI';INSERT INTO
TableA
(Title
,Description
) VALUES ( @gp1, @gp2); SELECTID
FROMTableA
WHERE row_count() > 0 ANDID
=last_insert_id() -- @gp1: 'My Title' (Type = String, IsNullable = false, Size = 8) -- @gp2: 'MyDescription' (Type = String, IsNullable = false, Size = 13) -- Executing at 11.1.2016 23:30:47 +02:00 -- Completed in 1 ms with result: EFMySqlDataReaderCommitted transaction at 11.1.2016 23:30:47 +02:00 Closed connection at 11.1.2016 23:30:47 +02:00 Disposed transaction at 11.1.2016 23:30:47 +02:00 Opened connection at 11.1.2016 23:30:55 +02:00 Started transaction at 11.1.2016 23:30:55 +02:00
SET SESSION sql_mode='ANSI';INSERT INTO
TableB
(Title
,Description
) VALUES ( @gp1, @gp2); SELECTID
FROMTableB
WHERE row_count() > 0 ANDID
=last_insert_id()-- @gp1: 'Table B Title' (Type = String, IsNullable = false, Size = 13) -- @gp2: 'Table B Description' (Type = String, IsNullable = false, Size = 19) -- Executing at 11.1.2016 23:30:55 +02:00 -- Completed in 6 ms with result: EFMySqlDataReader
Committed transaction at 11.1.2016 23:30:55 +02:00 Closed connection at 11.1.2016 23:30:55 +02:00 Disposed transaction at 11.1.2016 23:30:55 +02:00 Opened connection at 11.1.2016 23:30:58 +02:00 Started transaction at 11.1.2016 23:30:58 +02:00
INSERT INTO (SELECT
TableA_TableB
.TableAID
,TableA_TableB
.TableBID
FROMTableA_TableB
ASTableA_TableB
)(TableAID
,TableBID
) VALUES ( 1, 1)-- Executing at 11.1.2016 23:30:58 +02:00
-- Failed in 3 ms with error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(SELECT
TableA_TableB
.TableAID
,TableA_TableB
.TableBID
FROM `TableA_Tab' at line 1Closed connection at 11.1.2016 23:30:58 +02:00 Disposed transaction at 11.1.2016 23:30:58 +02:00 Exception thrown: 'System.Data.Entity.Infrastructure.DbUpdateException' in EntityFramework.dll
而且我表的的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;
我想知道這是一個錯誤還是我做錯了什麼事嗎?有人對我的問題有任何想法嗎?
在此先感謝!