C# 查询包含从LINQ到EF的XML列的SQL视图

C# 查询包含从LINQ到EF的XML列的SQL视图,c#,linq,sql-server-2008,entity-framework,sqlxml,C#,Linq,Sql Server 2008,Entity Framework,Sqlxml,我在SQL Server 2008中创建了一个表,如下所示: 编辑:我一直在做一些测试,将ANSI_NULLS设置为OFF和ON,我错误地粘贴了create table语句,ANSI_NULLS设置为OFF,我尝试了两种方法,但仍然出现了错误,但我想解决这个问题。希望没有其他粘贴错误 编辑2:我忘了指出,如果我查询原始表(TblValues),一切正常,只有在使用db视图(TblValuesView)时才会出现有关ANSI_NULLS选项的错误 关闭数值循环中止; 设置ANSI_填充、ANSI_

我在SQL Server 2008中创建了一个表,如下所示:

编辑:我一直在做一些测试,将ANSI_NULLS设置为OFF和ON,我错误地粘贴了create table语句,ANSI_NULLS设置为OFF,我尝试了两种方法,但仍然出现了错误,但我想解决这个问题。希望没有其他粘贴错误

编辑2:我忘了指出,如果我查询原始表(TblValues),一切正常,只有在使用db视图(TblValuesView)时才会出现有关ANSI_NULLS选项的错误

关闭数值循环中止;
设置ANSI_填充、ANSI_警告、CONCAT_NULL、ARITHABORT、,
带引号的标识符,ANSI为空;
去
创建表TBL值
(
上下文nvarchar(8)不为空,
ParentID uniqueidentifier不为空,
RowSeq int不为空,
字段值xml不为空,
FieldProperties xml不为空,
)在[小学]
text[主]上的图像\u
然后,我将这个表加载到我的数据模型中,并能够使用LINQ to EF查询它。FieldValues列中的XML内容如下所示:

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

一串
字段值
...
由于我需要以更易于阅读的方式提供xml列中的值,因此我为此表创建了一个视图,如下所示:

关闭数值循环中止;
设置ANSI_填充、ANSI_警告、CONCAT_NULL、ARITHABORT、,
带引号的标识符,ANSI为空;
去
创建视图TblValuesView
诡计多端
作为
选择TblValuesView.Context,
TblValuesView.ParentID,
TblValuesView.RowSeq,
FldValue.value(“(@fieldName)[1]”,作为fieldName的“nvarchar(30)”,
FldValue.value('(数据类型)[1],'nvarchar(13')作为数据类型,
FldValue.value(‘(FldValue)[1]’,‘nvarchar(max)’)作为FldValue,
从TblValues交叉应用FieldValues.nodes('/FieldValues/FieldValue')作为FldValues(FldValue)
去
然后,我也将此视图添加到数据模型中。现在,如果我从SQL Server Management Studio查询此视图,我会得到正确的值,如下所示:

Context |  ParentID | RowSeq | FieldName | DataType | FldValue
----------------------------------------------------------------
Ctx         <id>       1        txtName     String     Field Value
然后我得到以下异常:

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 studio获取此错误:

将ANSI_空值设置为OFF
从TblValuesView中选择*
我已经搜索了EF是否在运行时更改了此选项,并且我已经检查了我的数据库是否启用了ANSI_NULLS,并且默认为true。我还能查什么?没有多少资源可以处理这种情况


提前谢谢

首先,将表原样带到EF中,但将fieldvalue声明为private(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
等等……

我找到了罪犯

感谢一位知道如何在数据模型中设置连接的同事,我发现在打开与数据库的连接时正在执行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();
        }
    }
    ...
}
我这样做的原因是.NET4上的EF和ANSI_null存在问题。但是这样的查询似乎需要在上使用ANSI_null


总之:当使用nodes()时,包含Xml类型的视图在实体框架中工作。

我相信ANSI_NULLS将不再受支持,并且默认为ON,因此您可能无论如何都想摆脱它们。您必须使用视图还是允许您直接从EF访问XML内容?我也尝试过不使用ANSI_null,但这并没有什么区别。我需要做这两件事,直接从EF访问XML内容,并提供一种“简单”的方式通过视图进行报告…好的,很快将发布解决方案。。。为需要的人保留视图…当前版本的Entity Framework不支持XML数据类型。考虑到XML的重要性,未来的某个版本可能会提供全面的支持。我给你a+1,因为这个答案可以作为替代答案,但我认为我的问题仍然有效,因为视图确实与EF一起工作,只有当视图必须从XML类型中提取数据时,根据错误,我怀疑这可能是设置问题。。。编辑:原来我不能+1你的帖子:((没有足够的代表)但是谢谢!