そのため、クエリの作成に問題があります (クエリを作成することはできますが、プロパティを読み込もうとすると Entity Framework がクエリを中止します)。
Contact と ExternalContactExtension の 2 つのエンティティがあります。
コンタクト
連絡先 ID
内部です
...その他のデータ...
外部連絡先内線番号
連絡先 ID
...その他のデータ...
現在、contactId は両方のテーブルで同じですが、すべての連絡先が外部連絡先 (IsInternal で指定) であり、外部連絡先内線番号を持っているわけではありません。
問題は、クエリを実行して外部の連絡先内線番号を含めようとしたときです。ContactId は主キーと外部キーの両方であるため、null 許容ではありません。EFはそれが存在することを意味すると思います(ナビゲーションプロパティではゼロまたはワンにリストされていますが)。これにより、外部連絡先内線番号を持たない内部連絡先がある場合、クエリが中止されます。
これを回避する方法はありますか?それとも、外部の連絡先内線エンティティを個別に取得する必要がありますか?
編集:私のモデルの写真:
失敗したクエリ (通常はより多くのフィルタリング/インクルードが含まれていますが、ExternalContactExtension が含まれていることが、失敗したかどうかを判断するように見える唯一のものです):
DataSupplier.GetMany<Contact>(
x => x.Active,
x => x.ExternalContactExtension
).ToList();
GetMany 定義 (技術的には、中間クラスによって呼び出されますが、それはパラメーターを渡すだけです):
public virtual IEnumerable<TEntity> GetMany<TEntity>(Expression<Func<TEntity, bool>> where, params Expression<Func<TEntity, object>>[] includeProperties)
where TEntity : class
{
IDbSet<TEntity> set = this.context.Set<TEntity>();
var query = set.IncludeMultiple(includeProperties).AsQueryable<TEntity>();
query = query.Where(where);
this.queryString = "";
this.queryString = query.ToString();
List<TEntity> list = query.ToList();
return list;
}
エラーメッセージ:
プロパティを使用しようとするまで、実際にはメッセージをスローしません (その後、null 参照例外が発生します)。
別の編集:
SQL プロファイルを実行したところ、EF は正しく SQL を生成しています。
SELECT
[Extent1].[ContactId] AS [ContactId],
[Extent1].[EmployeeId] AS [EmployeeId],
[Extent1].[IsInternal] AS [IsInternal],
[Extent1].[GroupId] AS [GroupId],
[Extent1].[OldSupplierId] AS [OldSupplierId],
[Extent1].[Active] AS [Active],
[Extent1].[InsertUserId] AS [InsertUserId],
[Extent1].[InsertDate] AS [InsertDate],
[Extent1].[UpdateUserId] AS [UpdateUserId],
[Extent1].[UpdateDate] AS [UpdateDate],
[Extent2].[ContactId] AS [ContactId1],
[Extent2].[Salutation] AS [Salutation],
[Extent2].[FirstName] AS [FirstName],
[Extent2].[MiddleInitial] AS [MiddleInitial],
[Extent2].[LastName] AS [LastName],
[Extent2].[Phone] AS [Phone],
[Extent2].[Fax] AS [Fax],
[Extent2].[Title] AS [Title],
[Extent2].[Department] AS [Department],
[Extent2].[Email] AS [Email],
[Extent2].[Address] AS [Address],
[Extent2].[City] AS [City],
[Extent2].[Territory] AS [Territory],
[Extent2].[Country] AS [Country]
FROM [DataSupplier].[Contact] AS [Extent1]
LEFT OUTER JOIN [DataSupplier].[ExternalContactExtension] AS [Extent2] ON [Extent1].[ContactId] = [Extent2].[ContactId]
WHERE [Extent1].[Active] = 1
(外部結合を正しく実行しており、このSQLは正しい結果を返します/実行されます)。つまり、Entity Framework がそれを壊している処理を行っている場所です。