使用LINQ To SQL通过视图更新多个表的好方法是什么?

时间:2009-04-30 23:20:57

标签: sql-server linq

我有一个视图,它由两个表组成。我想通过视图编辑每个表中的值并保存这些更改,但LINQ引发了一个错误,即无法在同一视图上编辑两个值。

有没有人知道一个好的解决方法?

由于

3 个答案:

答案 0 :(得分:5)

SQLServer不支持从视图上的多个表更新列。您可以通过分离列更改来解决此问题,以便您只更新一个表上的列,提交更改,更新另一个表上的更改,然后再次提交更改。您还可以使用存储过程在同一事务中独立更新各个表。可以使用设计器将此存储过程作为方法添加到数据上下文中。假设它在完成时返回与视图相同的模式,它可以返回与视图相同类型的对象。

Reference

  

可更新视图您可以修改   底层基表的数据   通过一个观点,只要   以下条件属实:

     

任何修改,包括UPDATE,   INSERT和DELETE语句必须   仅来自一个基准的参考列   表。正在修改的列   视图必须直接引用   表列中的基础数据。   列不能在任何列中派生   其他方式,如通过   以下:聚合函数:   AVG,COUNT,SUM,MIN,MAX,GROUPING,   STDEV,STDEVP,VAR和VARP。一个   计算。列不能   从使用的表达式计算   其他专栏。形成的列   通过使用set运算符UNION,   UNION ALL,CROSSJOIN,除了和   INTERSECT相当于一个计算和   也不可更新。列   被修改不受影响   GROUP BY,HAVING或DISTINCT子句。   TOP没有在任何地方使用   一起查看视图的select_statement   使用WITH CHECK OPTION子句。

答案 1 :(得分:2)

第三个选项是创建一个INSTEAD OF触发器,您可以在其中编写代码以将更新的值拆分为两个不同的查询。

答案 2 :(得分:1)

虽然@ tvanfosson的答案绝对正确,但如果您使用的是LINQ-to-SQL,则可以直接在代码中引用这两个表,获取对象集合,更新它们并将其推回。在发出update命令后,我的理解是LINQ-to-SQL会将所有命令放在一个事务中并为你处理它。