c# - Entity Framework (EF6)+ MySql数据库第一个模型多对多关系错误查询生成

标签 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 的插入语句的输出,您可以在下面看到它:

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); SELECT ID FROM TableA WHERE row_count() > 0 AND ID=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: EFMySqlDataReader

Committed 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); SELECT ID FROM TableB WHERE row_count() > 0 AND ID=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 FROM TableA_TableB AS TableA_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 1

Closed 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;

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

提前致谢!

最佳答案

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

关于c# - Entity Framework (EF6)+ MySql数据库第一个模型多对多关系错误查询生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34731866/

相关文章:

c# - 是否可以在没有 "APIPassword"的情况下使用 PayPal API 接受付款

MySQL 无法检查点是否在距离内... MBRContains 查询错误或 Bug?

entity-framework - Entity Framework 4 v2 中的一对一关系与 POCO

templates - EF4 : Get the linked column names from NavigationProperty of an EDMX

c# - 使用 C# 代码运行 "Update-Database"Power Shell 命令时出现问题

c# - 识别 MethodInfo 实例是否是属性访问器

c# - 登录后 Azure AD 卡在循环中

c# - 如何使用 jQuery 复制带有下拉列表的表行

php - BIGINT 在 mysql 中创建为 INT

php - 为什么实体 getter 返回 null 而不是 0?