3

我在 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

有什么方法可以阻止类型提供者尝试指定计算字段?

4

2 回答 2

3

SqlDataConnection在后台使用 LINQ to SQL,因此您可以通过 DBML 文件自定义列处理。与其让类型提供者(有些不完整)推断整个 DB 模式,不如创建一个 DBML 文件并连接到该. 这是有关映射计算列的信息。

于 2013-07-16T12:21:45.587 回答
0

我相信你的设计违反了第二范式我认为更好的设计是让你的表只剩下两个字段:速率和数量以及运行时计算的“对象属性”。

于 2013-07-16T17:46:14.500 回答