Linq to sql Ошибка «Недопустимые данные на корневом уровне» для столбца с нулевым значением xml - PullRequest
3 голосов
/ 26 февраля 2010

Я создал таблицу как

CREATE TABLE [dbo].[tab1]( 
 [Id] [int] NOT NULL, 
 [Name] [varchar](100) NOT NULL, 
 [Meta] [xml] NULL, 


CONSTRAINT [PK_tab1] PRIMARY KEY CLUSTERED  
( 
     [Id] ASC 
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Когда я выполняю запрос linq to sql для извлечения данных, он выдает ошибку «данные на корневом уровне недопустимы для linq». В ходе дальнейшего расследования я узнаю, что в этом случае мета-столбец является нулевым. В действительности это может быть nullable. Нужно ли удалять nullable и устанавливать какой-то пустой корневой узел по умолчанию, или есть какой-то другой способ избавиться от ошибки.


Мой запрос linq, который выдает ошибку

     var obj1= (from obj in dbContext.tab1s
  where obj.id== 123
select obj).FirstOrDefault<Tab1>();

Ответы [ 2 ]

2 голосов
/ 21 марта 2010

Ни при каких обстоятельствах вы не получите эту ошибку, если значение столбца XML равно NULL.

Однако вы получите эту ошибку, если поле содержит некорректный XML, как предполагает ошибка.

SQL Server позволяет вам сделать это:

UPDATE tab1
SET Meta = 'blah'
WHERE id = 123

Очевидно, что строка "бла" является недопустимым XML, но SQL Server по-прежнему допускает это. Linq to SQL этого не делает, потому что он действительно попытается загрузить этот XML в XElement. Если вы запустите запрос с этим значением в столбце, вы получите точно такую ​​же ошибку: Недопустимые данные на корневом уровне .

Чтобы исправить эту ошибку, вам нужно исправить искаженный XML, который присутствует в базе данных.

0 голосов
/ 10 марта 2010

Создание имеет [tab1], но ваш выбор имеет [tab1s]

...