У меня есть таблица в SQL Server 2008 создается следующим образом:запрашивая SQL View, содержащие столбцы XML с помощью LINQ к EF
EDIT: Я делал некоторые тесты настройки ANSI_NULLS OFF и ON и я по ошибке вставил создать инструкцию таблицы с ANSI_NULLS OFF, я пробовал оба пути, и я все еще получаю ошибку, но хотел исправить это. Надеюсь, нет другой ошибки пасты.
EDIT 2: Я забыл указать, что, если я запросить исходную таблицу (TblValues) все работает, ошибка о параметре ANSI_NULLS происходит только при использовании вид дб (TblValuesView).
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
CREATE TABLE TblValues
(
Context nvarchar(8) NOT NULL,
ParentID uniqueidentifier NOT NULL,
RowSeq int NOT NULL,
FieldValues xml NOT NULL,
FieldProperties xml NOT NULL,
) ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
Затем я загрузил эту таблицу в свою модель данных и могу запросить ее с использованием LINQ to EF. Содержание XML в столбце FieldValues предназначено быть таким:
<FieldValues>
<FieldValue fieldName="txtName">
<DataType>String</DataType>
<FldValue>field value</FldValue>
</FieldValue>
...
</FieldValues>
Поскольку мне нужно предоставить значение в столбцах XML в более простом способе для чтения я создал представление для этой таблицы следующим образом:
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
CREATE VIEW TblValuesView
WITH SCHEMABINDING
AS
SELECT TblValuesView.Context,
TblValuesView.ParentID,
TblValuesView.RowSeq,
FldValue.value('(@fieldName)[1]', 'nvarchar(30)') AS FieldName,
FldValue.value('(DataType)[1]', 'nvarchar(13)') AS DataType,
FldValue.value('(FldValue)[1]', 'nvarchar(max)') AS FldValue,
FROM TblValues CROSS APPLY FieldValues.nodes('/FieldValues/FieldValue') AS FldValues(FldValue)
GO
Затем я добавил этот вид в модель данных. Теперь, если я запросить этот вид из среды SQL Server Management Studio, я получаю правильные значения, как:
Context | ParentID | RowSeq | FieldName | DataType | FldValue
----------------------------------------------------------------
Ctx <id> 1 txtName String Field Value
Но если выполнить следующий LINQ запрос:
var FldValueViewQuery = (from row in CTX.TblValuesView select row);
foreach(TblValuesView tblValue in FldValueViewQuery)
System.Diagnostics.Trace.WriteLine(tblValue.FieldName);
Затем я получаю следующее исключение:
System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.
System.Data.SqlClient.SqlException: SELECT failed because the following SET options have incorrect settings: 'ANSI_NULLS'.
Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.
Я могу только получить эту ошибку с SQL Server Mgmt студии, если я это сделать:
SET ANSI_NULLS OFF
select * from TblValuesView
Я искал, если EF изменяет эту опцию во время выполнения, и я уже проверил, что моя база данных имеет ANSI_NULLS включен и по умолчанию установлена истина. Что еще я могу проверить? там не так много ресурсов, которые имеют дело с этим сценарием.
Заранее благодарен!
Я считаю, что ANSI_NULLS больше не будет поддерживаться и по умолчанию включены, так что вы можете Ваты, чтобы избавиться от них так или иначе. Вам нужно использовать представление или вам будет разрешен доступ к XML-контенту непосредственно из EF? – Darek
Я тоже пробовал без ANSI_NULLS, но на самом деле это не имеет никакого значения. Мне нужно сделать и то, и другое, получить доступ к XML-контенту непосредственно из EF и обеспечить «легкий» способ просмотра для целей отчетности ... – dmiranda84
Хорошо, скоро опубликуйте решение ... Держите представление для тех, кто в нем нуждается ... – Darek