2012-07-31 3 views
0

У меня есть таблица в 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 включен и по умолчанию установлена ​​истина. Что еще я могу проверить? там не так много ресурсов, которые имеют дело с этим сценарием.

Заранее благодарен!

+0

Я считаю, что ANSI_NULLS больше не будет поддерживаться и по умолчанию включены, так что вы можете Ваты, чтобы избавиться от них так или иначе. Вам нужно использовать представление или вам будет разрешен доступ к XML-контенту непосредственно из EF? – Darek

+0

Я тоже пробовал без ANSI_NULLS, но на самом деле это не имеет никакого значения. Мне нужно сделать и то, и другое, получить доступ к XML-контенту непосредственно из EF и обеспечить «легкий» способ просмотра для целей отчетности ... – dmiranda84

+0

Хорошо, скоро опубликуйте решение ... Держите представление для тех, кто в нем нуждается ... – Darek

ответ

0

я нашел виновника.

Благодаря коллеге, который знал, как было установлено соединение в нашей модели данных, я узнал, что команда SET ANSI_NULLS OFF выполнялась прямо при открытии соединения с базой данных, в результате чего все наши команды запускались с этой настройкой , вот так:

public class MyConnection : DbConnection 
{ 
    ... 
    public override void Open() 
    { 
     using (SqlCommand cmd = new SqlCommand("SET ANSI_NULLS OFF", (SqlConnection)this.WrappedConnection)) 
     { 
      cmd.ExecuteNonQuery(); 
     } 
    } 
    ... 
} 

Причина, по которой я был предоставлен для этого, заключается в том, что существует проблема с EF и ANSI_NULLS.NET 4. Но для запросов, подобных этому, требуется использовать ANSI_NULLS ON.

Итак, в заключении: просмотров, которые содержат типы Xml DO РАБОТЫ в Entity Framework при использовании узлов()

0

Во-первых, принесите таблицу как есть в EF, но объявите FieldValues ​​как конфиденциальную (getter и setter). Добавьте следующий код:

public partial class TblValues 
{ 
    private XElement fldXmlValues = null; 
    public XElement FieldXmlValues 
    { 
     get{ 
      if (fldXmlValues == null){ 
       fldXmlValues = XElement.Parse(this.FieldValues); 
       fldXmlValues.Changed += (s,e) => this.FieldValues = fldXmlValues.ToString(); 
      } 
      return fldXmlValues; 
     } 
     set{ 
      fldXmlValues = value; 
      fldXmlValues.Changed += (s,e) => this.FieldValues = fldXmlValues.ToString(); 
      this.FieldValues = fldXmlValues.ToString(); 
     } 
    } 
    } 

Тогда вы должны иметь доступ через:

from t in context.TblValues 
select t.FieldXmlValues.Attribute("fieldName").Value as FieldName 

и так далее ....

+0

В текущей версии Entity Framework не поддерживается тип данных XML. Учитывая важность XML, вполне вероятно, что какая-то будущая версия обеспечит полную поддержку. – Darek

+0

Я даю вам +1, потому что этот ответ может работать как альтернатива, но я думаю, что мой вопрос по-прежнему эффективен, поскольку представления DO работают с EF, только когда представление должно извлекать данные из типов XML и основываться на ошибке я подозреваю, что это может быть проблема с настройками ... ** EDIT: ** Оказывается, я не могу +1 ваш пост :((не достаточно репутации), но спасибо! – dmiranda84

 Смежные вопросы

  • Нет связанных вопросов^_^