Вычисляемые столбцы и Microsoft.FSharp.Data.TypeProviders.SqlDataConnection

У меня есть таблица в базе данных 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

Есть ли способ предотвратить попытку поставщика типа указать вычисляемое поле?


person mpeac    schedule 16.07.2013    source источник


Ответы (2)


SqlDataConnection внутри использует LINQ to SQL, поэтому вы можете настроить обработку столбцов с помощью файла DBML. Вместо того, чтобы позволить поставщику типов (несколько не полностью) вывести всю схему БД, создайте файл DBML и подключиться к этому. Вот информация о сопоставлении вычисляемых столбцов.

person Craig Stuntz    schedule 16.07.2013

Я считаю, что ваш дизайн нарушает вторую нормальную форму. два поля: Rate и Quantity и вычисляемое «свойство объекта» во время выполнения.

person Wei Ma    schedule 16.07.2013