[英]Entity-Framework: Create Many-To-Many-Relations
我們對應用程序使用“ DB-First”方法,因為數據庫在各種應用程序之間共享,所以它應該是“主數據庫”。 (MySQL的)
我們有3個簡單的表,負責角色到權限的分配,如下所示:
Visual-Studio模型設計器(從數據庫中構建模型之后)可以很好地將其識別為“多對多”關系,甚至不會生成“ Role_to_permission” -Entity,因為分配沒有其他屬性)
到目前為止,我們已經在數據庫中創建了這些條目,這些條目導致了應用程序內的預期結果。 (訪問映射)
當前,我們正在開發接口,允許將“權限”分配給“角色”。 在這里,我有點卡住了:
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();
}
這總是導致異常,我不知道為什么(ID存在並且正確)...
db.SaveChanges()
異常:
EntityFramework.dll中發生類型為'System.Data.Entity.Infrastructure.DbUpdateException'的異常,但未在用戶代碼中處理
附加信息:保存不公開外鍵屬性為其關系的實體時發生錯誤。 EntityEntries屬性將返回null,因為無法將單個實體標識為異常的來源。 通過在實體類型中公開外鍵屬性,可以簡化保存時的異常處理。 有關詳細信息,請參見InnerException。
內部異常:
更新條目時發生錯誤。 有關詳細信息,請參見內部異常。
內部內部異常:
您的SQL語法有誤; 檢查對應於你的MySQL服務器版本使用附近的正確語法手冊“(SELECT
Permission_to_Role
。PermissionId
,Permission_to_Role
。RoleId
FROM”在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
截至當前評論:我為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是錯誤的實現?)
我真的很想弄清楚這個問題的“原因”,但現在,我在該關系表中添加了另一列grantedById
(引用user.id
)。
因此,這導致在模型中生成中間實體Permission_To_Role
,並讓我相信它現在可以正常工作! (原因是執行了數百次,如下所示:)
using (MyDb db = new MyDB()){
Permission_To_Role ptr = new Permission_To_Role();
ptr.PermissionId = 5;
ptr.RoleId = 8;
ptr.GrantedById = Session.CurrentUser.Id;
db.Permission_To_Role.Add(ptr);
db.SaveChanges();
}
但是,也應該只對帶有2個Foreign-Key-Constraint Columns
Many-To-Many-Mappings
進行數據庫插入,不是嗎?
我現在有點累,但是終於開始工作了。
我不是100%肯定會概述真正的問題,因為我做了很多更改-但是以下“發現”是解決此問題時的里程碑:
如上所述,我嘗試添加更多列,但沒有成功。 這導致Mapping-Table作為實體出現,但是插入內容顯示了相同的問題。 (插入查詢,包含有線的“ SELECT”語句而不是表名)
我注意到,生成的映射表(在EM-Designer中)考慮了所有列作為主鍵 , 而我在MySQL-Designer中設計了沒有任何(復合)主鍵的表 (只有一個唯一的鍵被安裝了)所有列):
我就像f *** y **-並在映射表中添加了代理主鍵列(在數據庫設計器中)...
並取消選中EF-Designer中任何剩余列的主鍵成員資格:
你猜怎么着? 有用 :-)
using (MyDb db = new MyDB()){
Permission_to_Role ptr = new Permission_to_Role();
ptr.PermissionId = permissionId;
ptr.RoleId = r.Id;
ptr.GrantedById = u.Id;
ptr.GrantedAt = DateTime.Now;
db.Permission_to_Role.Add(ptr);
db.SaveChanges();
}
因此,還有三件事要說:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.