簡體   English   中英

實體框架:創建多對多關系

[英]Entity-Framework: Create Many-To-Many-Relations

我們對應用程序使用“ DB-First”方法,因為數據庫在各種應用程序之間共享,所以它應該是“主數據庫”。 (MySQL的)

我們有3個簡單的表,負責角色到權限的分配,如下所示:

在此處輸入圖片說明

Visual-Studio模型設計器(從數據庫中構建模型之后)可以很好地將其識別為“多對多”關系,甚至不會生成“ Role_to_permission” -Entity,因為分配沒有其他屬性)

在此處輸入圖片說明

到目前為止,我們已經在數據庫中創建了這些條目,這些條目導致了應用程序內的預期結果。 (訪問映射)

當前,我們正在開發接口,允許將“權限”分配給“角色”。 在這里,我有點卡住了:

  • 如果這樣的關系具有另一個屬性(例如requireddate ),則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_RolePermissionIdPermission_to_RoleRoleId 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

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是錯誤的實現?)

我真的很想弄清楚這個問題的“原因”,但現在,我在該關系表中添加了另一列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();
}

因此,還有三件事要說:

  • 首先(我在相當長的時間內記下了時間)-在將模型與數據庫同步時-有一些未選擇的更改...而且您將很難找出它。 它可能只是“索引”,但也可能是諸如“外鍵約束”甚至“主鍵設置”之類的東西。 (將Hibernate (Java)視為80/20規則的主要部分:Hibernate占80%-搜索最終的20%取決於用戶!)
  • 第二:這個問題可能是特殊的數據庫模式的組合,它依賴於第三方框架,並期望所有東西都自動變得干凈整潔……只相信“自己”!
  • 第三:始終為每個表使用代理主鍵。 它完全沒有傷害,但是避免了使用本機主鍵的所有麻煩。 (仍然可以將其設置為唯一鍵)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM