Мы используем подход «DB-First» для приложения, поскольку база данных совместно используется различными приложениями, поэтому она должна быть «главной». (MySQL)
У нас есть 3 простые таблицы, отвечающие за Role-To-Permission Назначение, например:

Visual-Studio Model Designer (после построения модели из базы данных) прекрасно замечает это как отношение «многие ко многим», даже не генерируя объект «Role_to_permission», так как никаких дополнительных атрибутов на назначение)

До сих пор мы создавали те записи в базе данных, которые приводят к ожидаемому результату в приложении. (Доступ к сопоставлениям)
В настоящее время мы работаем над интерфейсом, позволяющим назначать «Права» для «Роли». И тут я немного застрял:
- Если такое отношение имеет другой атрибут (например,
required
или date
), EMF создает собственный объект для отношения - предположим, Permission_To_Role
.
тогда я могу "легко" создать отношение со следующим кодом:
using (MyDb db = new MyDB()){
Permission_To_Role ptr = new Permission_To_Role();
ptr.PermissionId = 5;
ptr.RoleId = 8;
ptr.CreationDate = DateTime.Now();
db.Permission_To_Role.Add(ptr);
db.SaveChanges();
}
Как бы то ни было - в этом случае - у нас нет дополнительных атрибутов в отображении, поэтому дополнительный класс исключен EF Framework.
Я сейчас очень стараюсь создать отношения, но безуспешно:
using (MyDB db = new MyDB())
{
//Get ids.
long permissionId = 2;
long roleID = 5;
Permission p = db.Permission.Find(permissionId);
Role r = db.Role.Find(roleID);
r.Permissions.Add(p);
db.SaveChanges();
}
Это всегда приводит к исключению, и я не могу понять, почему (идентификаторы существуют и правильны) ...
Исключение db.SaveChanges()
:
Исключение типа
«System.Data.Entity.Infrastructure.DbUpdateException» произошло в
EntityFramework.dll, но не был обработан в коде пользователя
Дополнительная информация: при сохранении сущностей произошла ошибка
не выставляйте свойства внешнего ключа для их отношений.
Свойство EntityEntries вернет значение NULL, поскольку один объект не может
быть идентифицированным как источник исключения. Обработка исключений
в то время как сохранение может быть сделано проще, выставляя свойства внешнего ключа в
ваши типы сущностей. Подробности смотрите в InnerException.
Внутреннее исключение:
Произошла ошибка при обновлении записей. Смотрите внутреннее исключение
для деталей.
Внутреннее Внутреннее Исключение:
В вашем синтаксисе SQL есть ошибка; проверьте руководство, которое
соответствует вашей версии сервера MySQL для правильного использования синтаксиса
рядом '(ВЫБРАТЬ Permission_to_Role
. PermissionId
,
Permission_to_Role
. RoleId
ОТ 'в строке 1
Идеи
Обновление:
SHOW CREATE TABLE Permission_to_Role;
выход:
CREATE TABLE `Permission_to_Role` (
`PermissionId` bigint(19) NOT NULL,
`RoleId` bigint(19) NOT NULL,
UNIQUE KEY `Permission_to_Role_unique` (`PermissionId`,`RoleId`),
KEY `Permission_Mapping_idx` (`PermissionId`),
KEY `Role_Mapping_idx` (`RoleId`),
CONSTRAINT `Permission_Mapping` FOREIGN KEY (`PermissionId`) REFERENCES `permission` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT `Role_Mapping` FOREIGN KEY (`RoleId`) REFERENCES `role` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Update2:
Что касается текущих комментариев: я включил вывод для запросов, сгенерированных EF, и обнаружил это очарование - что, очевидно, является искаженным запросом:
INSERT INTO
(SELECT
Permission_to_Role.PermissionId,
Permission_to_Role.RoleId
FROM
Permission_to_Role AS Permission_to_Role
)
( PermissionId, RoleId) VALUES ( 2, 1)
Фактический запрос должен быть:
INSERT INTO
Permission_To_Role
( PermissionId, RoleId) VALUES ( 2, 1)
Итак, я думаю, это выглядит как "ошибка"? Как уже упоминалось выше:
Как бы то ни было - в этом случае - у нас нет никакого дополнительного атрибута в отображении, поэтому дополнительный класс исключен EF Framework.
промежуточного звена Permission_To_Role
нет, следовательно, EF пытается заменить это имя таблицы на запрос
SELECT
Permission_to_Role.PermissionId,
Permission_to_Role.RoleId
FROM
Permission_to_Role AS Permission_to_Role
ДАЖЕ при вставках ... (Может быть, это работает для MsSQL и является плохой реализацией для MySQL Connector?)