计算列和Microsoft.FSharp.Data.TypeProviders.SqlDataConnection

时间:2013-07-16 06:57:47

标签: sql f# type-providers

我在SQL数据库中有一个表,其中包含一个计算列,如下所示:

CREATE TABLE MyTable
(
Rate     decimal(10,5) NOT NULL,
Quantity int           NOT NULL,
Cost as Quantity * Rate
)

当我尝试使用Microsoft.FSharp.Data.TypeProviders.SqlDataConnection类型提供程序向此表插入行时,它失败并显示错误“列”“成本”无法修改,因为它是计算列或是UNION运算符的结果。“

相应生成的SQL是:

INSERT INTO [MyTable]([Rate], [Quantity], [Cost])
VALUES (@p0, @p1, @p2)

SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
-- @p0: Input Decimal (Size = -1; Prec = 10; Scale = 5) [99.77]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [1000000]
-- @p2: Input Decimal (Size = -1; Prec = 21; Scale = 5) [Null]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.17929

有没有办法阻止类型提供程序尝试指定计算字段?

2 个答案:

答案 0 :(得分:3)

SqlDataConnection正在使用LINQ to SQL,因此您可以通过DBML文件自定义列处理。而不是让类型提供程序(有点不完整)推断整个数据库模式,而是创建一个DBML文件和connect to that。这是information on mapping computed columns

答案 1 :(得分:0)

我认为你的设计违反了Second Normal Form我认为更好的设计是让你的表只有两个字段:Rate和Quantity以及运行时计算的“object属性”。