这件事困扰了我一段时间,我终于希望得到答案。
说我有员工和部门。两者之间存在多对多关系,其关联表名为EmployeeDepartments。
Employees
-------------------
EmployeeID (PK)
Departments
-------------------
DepartmentID (PK)
EmployeeDepartments
-------------------
EmployeeID (FK)
DepartmentID (FK)
我有一个用户可以编辑员工的页面。有一个复选框列表,显示所有部门,并检查员工所属的部门。然后,用户可以选中/取消选中该员工所属的部门。
当我编辑员工并去保存数据时,我应该如何处理这些部门?
我一直在做的方法是删除EmployeeDepartments表中该员工的每条记录。然后,对于用户选择的每个部门,我将其添加到EmployeeDepartments。
它有效,但必须有一种更有效的方法来做到这一点,它似乎是错误的。如果一名员工在5个部门,并且我将该员工添加到另一个部门,我将从EmployeeDepartments中删除5条记录,然后添加6条记录。
答案 0 :(得分:2)
只需处理更改增量。也就是说,查看当前“选中”的项目,然后选择要选择的项目,然后添加或删除相应的项目。这可以使用set操作计算(在LINQ中很简单)。
old - new
中的项目(设置差异,或Except
)new - old
(设置差异,或Except
)new ^ old
中的项目不受影响)如果需要,大部分工作都可以移交给数据库。 (删除除了......以及插入,如果不存在...例如。另请参阅标准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}