在视图上执行InsertOnSubmit

时间:2014-03-25 14:36:22

标签: sql-server linq-to-sql sql-view

我们有一个带有Linq2Sql和SQL Server-Backend的ASP.NET MVC应用程序。应用程序在我们客户的主站点上运行,但每个站点在SQL Server中都有自己的数据库。 (由于不同的原因,它们不应该在彼此之间共享大部分信息。)但是,一些一般信息是共享的,它存储在共享数据库中,并且每个特定于站点的数据库都有表示这些表的视图在各自的数据库中。

例如,我有站点S1,S2,S3及其数据库D1,D2,D3和带有共享表TS的分片数据库DS

现在在数据库S1-S3中我会看到一个基本查询的视图:

SELECT * FROM DS.TS;

如果像这样编写,SQL Server会以某种方式自动将所有插入,更新和删除传播到DS.TS,而无需显式而不是触发器。这使我们的生活变得更加轻松,因为我们还需要只处理一个与一个数据库的连接,而不需要打扰两个不同的数据库。

虽然我们自己在应用程序中编写了删除和更新命令,但没有使用Linq2Sql,但它们运行正常。但是,共享表上的insert命令正在使用InsertOnSubmit,并且失败并出现以下异常:

Can't perform Create, Update, or Delete operations on 'Table(TS)' because it has no primary key.
   at System.Data.Linq.Table`1.InsertOnSubmit(TEntity entity)  

有没有办法让这项工作,或者我必须自己在这些共享表上创建插入命令并使用DbCommand.ExecuteNonQuery()执行它们

2 个答案:

答案 0 :(得分:1)

带有视图的LINQ to SQL不知道哪个列包含密钥。您可以调整生成的模型,并仅根据需要设置应作为主键的列。请注意,在您看来,您不应该选择*,因为它可能会随着时间的推移而消除性能。

答案 1 :(得分:0)

您可以将模型中主键的IsPrimaryKey属性设置为True