0

У меня есть проект, который имеет существующую структуру и данные базы данных. В настоящее время проект работает на PHP + MySQL, и я пытаюсь переключиться с PHP на C# EF 6.0 + MySQL Database.Entity Framework (EF6) + База данных MySql Первая модель От многих до многих отношений Неверное генерирование запросов

Я установил пакеты NuGet (EF 6.0 и MySQL.Data, MySQL.Web, MySQL.Data.Entity, MySQL.Data.Entities) и изменил мой app.config в соответствии с использованием поставщика данных MySQL. До этого состояния все работает отлично, я могу генерировать модель из базы данных и вставлять данные в каждую таблицу без каких-либо проблем, кроме таблиц отношений «ко многим». Я создал две фиктивные таблицы с именем 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

Также DDLS моей таблицы ниже:

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; 

I интересно, если это ошибка, или я делаю что-то неправильно, у кого-нибудь есть идея для моей проблемы?

Заранее благодарен!

ответ

0

Проблема была связана с отсутствием ПК на моей таблице отношений TableA_TableB после добавления PK (TableAID, TableBID) проблема решена. Кроме того, использование uint в EF вызывает проблему с одним сохранением (вы можете сохранять таблицы один за другим, а после получения идентификаторов вы можете создавать отношения)