我有一个视图,它由两个表组成。我想通过视图编辑每个表中的值并保存这些更改,但LINQ引发了一个错误,即无法在同一视图上编辑两个值。
有没有人知道一个好的解决方法?
由于
答案 0 :(得分:5)
SQLServer不支持从视图上的多个表更新列。您可以通过分离列更改来解决此问题,以便您只更新一个表上的列,提交更改,更新另一个表上的更改,然后再次提交更改。您还可以使用存储过程在同一事务中独立更新各个表。可以使用设计器将此存储过程作为方法添加到数据上下文中。假设它在完成时返回与视图相同的模式,它可以返回与视图相同类型的对象。
可更新视图您可以修改 底层基表的数据 通过一个观点,只要 以下条件属实:
任何修改,包括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会将所有命令放在一个事务中并为你处理它。