2016-09-26 10 views
0

I使用して、デシベル最初を使用して、常にnullを返し、特定の関連性を持っている:Entity Frameworkの付属テーブル

var results = _ABPRepository.Query(x => x.ABPArrangementId == arrangementId) 
        .Include(x => x.tb_ARRArrangement) 
        .Include(x => x.tb_ARRArrangement.Supplier) 
        .Include(x => x.tb_ARRArrangement.Supplier.tb_SCNSicCodesNew) 
        .Include(x => x.tb_BBRBatteryBackBrands) 
        .Include(x => x.tb_ARRArrangement.Supplier.Country) 
        .Include(x => x.tb_ARRArrangement.Supplier.InvoiceCountry) 
        .Include(x => x.Country) 
        .Select().FirstOrDefault(); 
以下

常にnullである:私は確認しました

x.tb_ARRArrangement.Supplier.tb_SCNSicCodesNew 

SQLは、(以下に簡単に)正しいこと:

SELECT 
    /* ... */ 
    [Project1].[SCN_SIC_Code] AS [SCN_SIC_Code], 
    [Project1].[SCN_SIC_Description] AS [SCN_SIC_Description] 
    /* ... */ 
    FROM (SELECT 
     /* ... */ 
     [Extent4].[SCN_SIC_Code] AS [SCN_SIC_Code], 
     [Extent4].[SCN_SIC_Description] AS [SCN_SIC_Description], 
     /* ... */ 
     CASE WHEN ([Extent8].[BBRIDNumber] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1] 
     FROM  [dbo].[tb_ABPArrangementBatteryBackProducer] AS [Extent1] 
     INNER JOIN [dbo].[tb_ARRArrangement] AS [Extent2] ON [Extent1].[ABPArrangementId] = [Extent2].[ARRIDNumber] 
     LEFT OUTER JOIN [dbo].[tb_SUPSupplier] AS [Extent3] ON [Extent2].[ARRSupplierId] = [Extent3].[SUPKey] 
     LEFT OUTER JOIN (SELECT 
           [tb_SCNSicCodesNew].[SCN_SIC_Code] AS [SCN_SIC_Code], 
           [tb_SCNSicCodesNew].[SCN_SIC_Description] AS [SCN_SIC_Description] 
         FROM [dbo].[tb_SCNSicCodesNew] AS [tb_SCNSicCodesNew]) AS [Extent4] ON [Extent3].[SUPEaHwrSicCode2007] = [Extent4].[SCN_SIC_Code] 
     LEFT OUTER JOIN [dbo].[tb_COUCountry] AS [Extent5] ON [Extent3].[SUPCountry] = [Extent5].[COUIDNumber] 
     LEFT OUTER JOIN [dbo].[tb_COUCountry] AS [Extent6] ON [Extent3].[SUPInvoiceCountry] = [Extent6].[COUIDNumber] 
     INNER JOIN [dbo].[tb_COUCountry] AS [Extent7] ON [Extent1].[ABPCorrespondanceCountry] = [Extent7].[COUIDNumber] 
     LEFT OUTER JOIN [dbo].[tb_BBRBatteryBackBrands] AS [Extent8] ON [Extent1].[ABPArrangementId] = [Extent8].[BBRABPIDNumber] 
     WHERE [Extent1].[ABPArrangementId] = 123456 
    ) AS [Project1] 

返されるレコードは、私が期待するデータが含まれていますが、それはトンにマップするために失敗しました彼は results.tb_ARRArrangement.Supplier.tb_SCNSicCodesNewプロパティです。

他のすべてのものには期待どおりの作業が含まれています。

私が試してみた:

  • その より、含まれるが、(などのグループ化)動作しない場合がありますが、インクルードが無視されていないが含まれて、彼らは私のシナリオには適用されていないように見えます 場所について読みますマッピングが失敗するようです。 EDMXからの連想とテーブルを削除

  • と再追加

  • の名前の変更と再作り協会とナビゲーションプロパティ

  • 洗浄と再構築

    あり

テーブル間のデータベース内の外部キーではありませんが、他のテーブルには存在しません。問題はありませんでした。

確認する事項はありますか?

+0

がどのようにある[ABPArrangementId:これは、コンテキストと同じプロジェクトに以下に配置することによって初期化され

using System.Data.Entity.Core.Common.CommandTrees; using System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder; using System.Data.Entity.Core.Metadata.Edm; using System.Data.Entity.Infrastructure.Interception; using System.Linq; namespace DataRepository { public class StringTrimmerInterceptor : IDbCommandTreeInterceptor { public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext) { if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace) { var queryCommand = interceptionContext.Result as DbQueryCommandTree; if (queryCommand != null) { var newQuery = queryCommand.Query.Accept(new StringTrimmerQueryVisitor()); interceptionContext.Result = new DbQueryCommandTree( queryCommand.MetadataWorkspace, queryCommand.DataSpace, newQuery); } } } private class StringTrimmerQueryVisitor : DefaultExpressionVisitor { private static readonly string[] _typesToTrim = { "nvarchar", "varchar", "char", "nchar" }; public override DbExpression Visit(DbNewInstanceExpression expression) { var arguments = expression.Arguments.Select(a => { var propertyArg = a as DbPropertyExpression; if (propertyArg != null && _typesToTrim.Contains(propertyArg.Property.TypeUsage.EdmType.Name)) { return EdmFunctions.Trim(a); } return a; }); return DbExpressionBuilder.New(expression.ResultType, arguments); } } } } 

:上記のリンクからのコードは、文字列をトリミングするインターセプタを追加することによって、問題を修正します]あなたのスキーマintまたはvarcharで定義されていますか? – DaniDev

+0

@DaniDevそれはintです – SWa

+0

Gottcha!それはlinqエンジンがそれをどのように解析したかに基づいているようです。ちょうど確かめたかった。私は残念ながら答えはありません。 – DaniDev

答えて

0

ここで説明したようにこれは、変数の長さに固定長文字列を連結するとEntity Frameworkの中の問題である:https://romiller.com/2014/10/20/ef6-1workaround-trailing-blanks-issue-in-string-joins/

問題が 文字列が、.NETの文字列関数を比較するとき、SQL Serverは、末尾のスペースを無視するということです(EFが使用する)はそうではありません。 SQL サーバー "ABCD"と "ABCD"は等しいと見なされますが、.NET(および EF)ではありません。

この結果、正しいデータが選択されましたがマッピングされませんでした。

using System.Data.Entity; 

namespace FixedLengthDemo 
{ 
    public class MyConfiguration : DbConfiguration 
    { 
     public MyConfiguration() 
     { 
      AddInterceptor(new StringTrimmerInterceptor()); 
     } 
    } 
} 
関連する問題