实体框架(EF6)+ MySql数据库第一模型多对多关系错误的查询生成

时间:2016-01-11 21:55:19

标签: c# mysql entity-framework-4 entity-framework-6 ef-database-first

我有一个拥有现有数据库结构和数据的项目。目前项目正在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。

您可以在下面看到模型生成的屏幕截图: enter image description here

以下生成的模型: enter image description here

到目前为止,一切看起来都不错,但正如我提到的,当我尝试在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语句的输出,您可以在下面看到它:

  

于2016年1月11日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   来自TableA    WHERE row_count()> 0 AND ID = last_insert_id()    - @ gp1:'我的标题'(Type = String,IsNullable = false,Size = 8)    - @ gp2:'MyDescription'(Type = String,IsNullable = false,Size = 13)    - 于2016年1月11日23:30:47 + 02:00执行    - 在1 ms内完成,结果为:EFMySqlDataReader

     

承诺交易于11.1.2016 23:30:47 +02:00   2016年1月11日23:30:47 + 02:00关闭连接   于2016年1月11日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   来自TableB    WHERE row_count()> 0 AND ID = last_insert_id()

     

- @ gp1:'表B标题'(Type = String,IsNullable = false,Size = 13)    - @ gp2:'表B描述'(Type = String,IsNullable = false,Size = 19)    - 于2016年1月11日23:30:55 + 02:00执行    - 在6 ms内完成,结果为:EFMySqlDataReader

     

承诺交易于11.1.2016 23:30:55 +02:00   2016年11月11日23:30:55 +02:00关闭连接   于2016年1月11日23:30:55 +02:00处理交易   已于11.1.2016 23:30:58 +02:00开通   于11.1.2016 23:30:58 +02:00开始交易

     

INSERT INTO(选择   TableA_TableBTableAID,   TableA_TableBTableBID   来自TableA_TableB AS TableA_TableB)(   TableAID,   TableBID)价值观(   1,   1)

     

- 于2016年1月11日23:30:58 +02:00执行

     

- 3 ms失败并出现错误:您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在'附近使用正确的语法'(SELECT   TableA_TableBTableAID,   TableA_TableBTableBID   来自第1行的“TableA_Tab”

     

于2016年1月11日23:30:58 + 02:00关闭连接   于2016年1月11日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;

我想知道这是一个错误还是我做错了什么有人对我的问题有任何想法?

提前致谢!

1 个答案:

答案 0 :(得分:0)

问题是关于添加PK(TableAID,TableBID)后问题解决后我的关系表TableA_TableB上缺少PK。另外在EF上使用uint会导致单个保存问题(您可以逐个保存表格,获取ID之后可以创建关系)