0

次のように作成されたSQLServer2008のテーブルがあります。

編集:ANSI_NULLSをOFFおよびONに設定していくつかのテストを行っていましたが、誤ってcreatetableステートメントをANSI_NULLSOFFで貼り付けました。両方の方法を試しましたが、それでもエラーが発生しますが、これを修正したいと思いました。うまくいけば、他の貼り付けエラーはありません。

編集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]

次に、このテーブルをデータモデルにロードし、LINQtoEFを使用してクエリを実行できます。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 ServerMgmtstudioからのみこのエラーが発生します。

SET ANSI_NULLS OFF
select * from TblValuesView

EFが実行時にこのオプションを変更するかどうかを検索し、データベースでANSI_NULLSが有効になっていて、デフォルトでtrueになっていることをすでに確認しました。他に何を確認できますか?このシナリオを扱うリソースはそれほど多くありません。

前もって感謝します!

4

2 に答える 2

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

等々....

于 2012-08-01T01:24:27.980 に答える