我在SQL Server 2008中创建了一个表,如下所示:
编辑:我一直在做一些测试,设置ANSI_NULLS OFF和ON,我错误地粘贴了使用ANSI_NULLS OFF的create table语句,我尝试了两种方式,但我仍然得到错误但是想修复这个。希望没有其他粘贴错误。
编辑2 :我忘了指出如果我查询原始表(TblValues)一切正常,那么只有在使用db视图(TblValuesView)时才会出现有关ANSI_NULLS选项的错误。
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查询它。 FieldValues列中的XML内容应如下所示:
<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 studio中收到此错误:
SET ANSI_NULLS OFF
select * from TblValuesView
我已经搜索了EF是否在运行时更改了此选项,并且我已经检查过我的数据库启用了ANSI_NULLS并且默认为true。我还能检查什么?没有太多资源可以处理这种情况。
提前致谢!
答案 0 :(得分: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
依旧......
答案 1 :(得分: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();
}
}
...
}
我之所以给出这个原因,是因为.NET 4上的EF和ANSI_NULLS存在问题。但是这样的查询似乎需要使用ANSI_NULLS ON。
总之:包含Xml类型的视图在使用nodes()时在Entity Framework中工作