2013-02-05 64 views
4

我有第三方服務,我從中獲取大量數據,我想將這些信息存儲在本地數據庫中。假設我的數據庫中有3個表格用戶,角色UserRoleEF Code First多對多關係 - 插入重複記錄到數據庫

  1. 用戶表包含以下字段 - UserId(PK),UserName。
  2. 角色表包含​​以下字段 - RoleId(PK),RoleName。
  3. UserRole表包含以下字段 - UserId(FK),RoleId(FK)。

所以有一個多對多用戶和角色表之間的關係。

當我嘗試將以下記錄保存到數據庫時,其生成的重複記錄在角色表中。

using (CFAContext context = new CFAContext()) 
{ 
    context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { new Role { RoleName = "Role 1" }, new Role { RoleName = "Role 2" }, new Role { RoleName = "Role 3" } } }); 
    context.Users.Add(new User { UserName = "User 2", Roles = new List<Role> { new Role { RoleName = "Role 1" }, new Role { RoleName = "Role 2" } } }); 
    context.Users.Add(new User { UserName = "User 3", Roles = new List<Role> { new Role { RoleName = "Role 1" }, new Role { RoleName = "Role 4" } } }); 
    context.SaveChanges(); 
} 

我怎麼能沒有用戶角色表中的任何重複記錄插入此列表數據庫(用戶和角色)?

回答

3

我猜RoleId字段是唯一的標識符,因此對於您添加的每個角色,在創建新的Role實例時,您將在數據庫中獲得一個新記錄,其中RoleId字段不同。

如果您將代碼更改爲以下版本,它將起作用;

Role role1 = new Role { RoleName = "Role 1" } 
Role role2 = new Role { RoleName = "Role 2" } 
Role role3 = new Role { RoleName = "Role 3" } 
Role role4 = new Role { RoleName = "Role 4" } 

context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { role1, role2, role3 } }); 
    context.Users.Add(new User { UserName = "User 2", Roles = new List<Role> { role1,role2 } }); 
    context.Users.Add(new User { UserName = "User 3", Roles = new List<Role> { role1, role4 } }); 
    context.SaveChanges(); 
+0

謝謝daryal。我的情況就像我需要插入大約50000行,並且當前列表的格式是我在問題中給出的。所以根據你的建議,首先我必須從集合中收集角色列表,並且在向上下文添加記錄時,我必須參考上述角色列表。這對我來說是正確的方法還是您有任何其他建議? – Dennis

+0

@ Dennis你是對的,首先創建角色,然後在創建用戶時使用這些角色,然後堅持。 – daryal

0

您正在創建3個名爲「角色1」的角色,我將在角色表中創建此記錄,並在需要將其分配給用戶時簡單檢索它。

0

下面的代碼創建4個新的角色。如果它被執行兩次,那麼db中會有8個角色。如果您不希望在其他執行中複製角色,則應從上下文中選擇它們。

using (CFAContext context = new CFAContext()) 
{ 
    var roles = new List<Role> { 
     new Role { RoleName = "Role 1" }, 
     new Role { RoleName = "Role 2" }, 
     new Role { RoleName = "Role 3" }, 
     new Role { RoleName = "Role 4" } 
    }; 

    context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { roles[0], roles[1], roles[2] } }); 
    context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { roles[0], roles[1] } }); 
    context.Users.Add(new User { UserName = "User 1", Roles = new List<Role> { roles[0], roles[3] } }); 
    context.SaveChanges(); 
} 

順便說一句你的RoleId怎麼樣?

+0

謝謝穆罕默德。我的情況是,我需要插入大約50000行,並且User和Roles表包含10個以上的列。由於關係是多對多,我從服務contains中獲得的集合重複了User和Role記錄。所以根據你的建議,首先我必須從集合中收集角色和用戶列表,並且在向上下文添加記錄的同時,我必須參考以上角色和用戶列表。右圖?這對我來說是正確的方法還是您有任何其他建議? – Dennis

相關問題