以多对多关系编辑关联表中的记录

时间:2011-05-09 19:56:28

标签: c# asp.net sql

这件事困扰了我一段时间,我终于希望得到答案。

说我有员工和部门。两者之间存在多对多关系,其关联表名为EmployeeDepartments。

Employees
-------------------
EmployeeID (PK)

Departments
-------------------
DepartmentID (PK)

EmployeeDepartments
-------------------
EmployeeID (FK)
DepartmentID (FK)

我有一个用户可以编辑员工的页面。有一个复选框列表,显示所有部门,并检查员工所属的部门。然后,用户可以选中/取消选中该员工所属的部门。

当我编辑员工并去保存数据时,我应该如何处理这些部门?

我一直在做的方法是删除EmployeeDepartments表中该员工的每条记录。然后,对于用户选择的每个部门,我将其添加到EmployeeDepartments。

它有效,但必须有一种更有效的方法来做到这一点,它似乎是错误的。如果一名员工在5个部门,并且我将该员工添加到另一个部门,我将从EmployeeDepartments中删除5条记录,然后添加6条记录。

2 个答案:

答案 0 :(得分:2)

只需处理更改增量。也就是说,查看当前“选中”的项目,然后选择要选择的项目,然后添加或删除相应的项目。这可以使用set操作计算(在LINQ中很简单)。

  1. 删除old - new中的项目(设置差异,或Except
  2. new - old(设置差异,或Except
  3. 中添加项目
  4. new ^ old中的项目不受影响)
  5. 如果需要,大部分工作都可以移交给数据库。 (删除除了......以及插入,如果不存在...例如。另请参阅标准SQL MERGE语句和非标准等价物和扩展名。)

    确保正确使用数据库事务以确保一致性。

    快乐的编码。

答案 1 :(得分:2)

如果您的SQL产品支持它,您可以使用标准SQL的MERGE。如果您的SQL产品是SQL Server,那么您很幸运:它的MERGE有一个漂亮的扩展IF NOT MATCHED BY SOURCE,除了DELETE和{{1}之外,您还可以INSERT }。

这是一个简单的例子(例如省略参照完整性约束):

UPDATE

在编辑后说,您将值放在临时表中:

CREATE TABLE EmployeeDepartments 
(
 EmployeeID INTEGER NOT NULL, 
 DepartmentID INTEGER NOT NULL, 
 UNIQUE (DepartmentID, EmployeeID)
);

INSERT INTO EmployeeDepartments (EmployeeID, DepartmentID)
   VALUES (1, 1), 
          (1, 2);

简单英语中会插入行CREATE TABLE StagingTable ( EmployeeID INTEGER NOT NULL, DepartmentID INTEGER NOT NULL, UNIQUE (DepartmentID, EmployeeID) ); INSERT INTO StagingTable (EmployeeID, DepartmentID) VALUES (1, 1), (1, 3); ,行{1, 3}将被删除,行{1, 2}将保留:

{1, 1}