编程语言
首页 > 编程语言> > c#-实体框架4.1-TPT渴望加载-“指定表达式的ResultType与所需类型不兼容”

c#-实体框架4.1-TPT渴望加载-“指定表达式的ResultType与所需类型不兼容”

作者:互联网

我有一个具有TPT继承的模型.

>位置(抽象)
>街道(来自位置)
> GoogleStreetView(1街-> 0..1 GoogleStreetView)

以上每个都有自己的表.

一切正常,直到我添加了“ GoogleStreetView”表(由PK / FK支持Street).

当我尝试这样做时:

var street = _locationRepository
   .Find()
   .OfType<Street>()
   .Include(x => x.GoogleStreetView)
   .SingleOrDefault(x => x.LocationId == 1);

我得到错误:

The ResultType of the specified expression is not compatible with the required type. The expression ResultType is ‘Transient.reference[xxxx.Repositories.SqlServer.Location]’ but the required type is ‘Transient.reference[xxxx.Repositories.SqlServer.Street]’.
Parameter name: arguments[0]

什么…

然后我发现this thread基本上表明这是EF 4(和EF 4.1 RTM的错误).

我不理解“使用独立的关联,而没有FK的支持”的解决方法.

我使用存储库/ UoW模式,因此我的LocationRepository仅可以访问ObjectSet< Location>.因此,我无法在LINQ查询中进行显式联接.

在此阶段,看来我根本不必映射此表,而可以使用存储过程从数据库中获取它.叹.

谁能对此有所启发,并提供解决方案?

解决方法:

好的,我找到了一种解决方法.

那就是翻转FK.

所以代替:

1 Street -> 0..1 GoogleStreetView

哪个是正确的,我现在有:

* Street -> **0..1 GoogleStreetView

因此,现在Street具有指向GoogleStreetView的可空FK.

从代码的角度来看,这种方法行之有效,但从数据库的角度来看,这是完全错误的,因为缺乏参照完整性,一个特定的GoogleStreetView记录可能指向多个Street记录,这没有任何意义.

但这似乎是唯一正确的解决方法.

似乎EF不支持由PK / FK组合支持的1-0..1关联.

如果你问我,那是不可接受的.如果他们知道这是EF 4.0中的错误,为什么不在4.1中修复它?

编辑

同样,上述解决方法将起作用,对在概念方面破坏参照完整性不满意.

因此,我决定完全不映射该实体,而通过存储过程从数据库中获取它.

标签:eager-loading,entity-framework-4-1,table-per-type,c,entity-framework
来源: https://codeday.me/bug/20191208/2090811.html