繁体   English   中英

包括一个可选的导航属性,其中导航属性ID与实体的主键相同

[英]Including an optional navigation property, where the navigation property Id is the same as the entity's primary key

因此,在创建查询时遇到问题(我可以创建查询,但是在尝试加载属性时,Entity Framework会中止该查询)。

我有两个实体:Contact和ExternalContactExtension。

联系

ContactId

是内部的

...其他一些数据...

外部联系人扩展

ContactId

...其他一些数据...

现在,两个表中的contactId都相同,但是并非所有的Contacts都是外部联系人(由IsInternal指定),并且具有外部联系人扩展名。

所以问题是当我运行查询并尝试包括外部联系人扩展名时。 由于ContactId既是主键又是外键,因此它不能为空。 我认为EF用它来表示它存在(即使在导航属性中它以零或一列出)。 如果我有任何没有外部联系人扩展名的内部联系人,这将导致查询被中止。

有没有办法解决? 还是我必须单独获取外部联系人扩展实体?

编辑:我的模型的图片:

在此处输入图片说明

查询失败(通常会进行更多的过滤/包含,但只有包含include 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;
    }

错误信息:

在此处输入图片说明

在尝试使用属性之前,它实际上不会抛出任何消息(然后我得到一个空引用异常)。

另一个编辑:

我做了一个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确实返回了正确的结果/它运行了)。 因此,它是实体框架正在进行破坏它的处理的地方。

基于聊天,解决此问题的最佳方法可能是创建“缺失”的ExternalContactExtensionID字段,该字段可以为NULL

您只需稍作调整即可完成该操作。 创建一个计算字段并使用公式:

CASE WHEN IsExternal THEN ContactID ELSE NULL END

然后,EF将看到它的期望,而且一切都应该很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM