我有一个带有TPT继承的模型。
1 Street -> 0..1 GoogleStreetView)上面的每一个都有自己的表。
在我添加"GoogleStreetView“表(它由PK/FK支持到Street)之前,一切都很好。
当我尝试这样做的时候:
var street = _locationRepository
.Find()
.OfType<Street>()
.Include(x => x.GoogleStreetView)
.SingleOrDefault(x => x.LocationId == 1);我知道错误:
指定表达式的ResultType与所需类型不兼容。表达式'Transient.referencexxxx.Repositories.SqlServer.Location‘是'Transient.referencexxxx.Repositories.SqlServer.Street'.,但所需的类型是’Transient.referencexxxx.Repositories.SqlServer.Street‘.。参数名称:参数
什么.?
然后我找到了这条线,它基本上说这是一个带有EF 4的bug (从外观上看,它是EF4.1RTM)。
我不明白“使用一个独立的协会,没有支持的FK”的解决办法。
我使用存储库/ UoW模式,因此我的LocationRepository只能访问ObjectSet<Location>。因此,我不能在LINQ查询中进行显式联接。
在这个阶段,看起来我根本不需要映射这个表,而是使用存储过程从数据库中获取它。叹一口气。
有人能对此有所了解,并提出解决方案吗?
发布于 2011-05-30 01:26:49
好吧,我找到了一个解决办法。
那就是翻转FK。
因此,与其:
1 Street -> 0.1 GoogleStreetView
这是正确的,我现在有:
*街-> **0.1 GoogleStreetView
现在,Street有一个可空的FK,指向GoogleStreetView。
从代码的角度来看,这是很好的,但是从数据库的角度来看,这是完全错误的,因为由于缺乏引用完整性,一个特定的GoogleStreetView记录可能指向多条街道记录,这是没有任何意义的。
但这似乎是唯一合适的解决办法。
看起来EF不支持1-0.1由PK/FK组合支持的协会。
如果你问我是不能接受的。如果他们知道这是EF 4.0中的一个错误,为什么不在4.1中修复呢?
编辑
另外,上述解决办法也会奏效,不满意于破坏概念方面的参考完整性。
因此,我决定根本不映射这个实体,而是通过存储过程从DB中获取它。
https://stackoverflow.com/questions/6171455
复制相似问题