C# EF4:NavigationProperty和join:是bug还是特性?

C# EF4:NavigationProperty和join:是bug还是特性?,c#,sql,entity-framework,join,C#,Sql,Entity Framework,Join,我想咨询一下我面临的一个问题。我开始处理一个非常困难的数据库项目:数据库中的许多表没有主键或有多个PK,因此我无法为edmx中的所有实体添加正确的关联。然而,对于某些实体,这是可能的,我设法做到了。因此,我有两个实体,它们之间有关联:Vulner和VulnerDescription。我有一个Vulner的“坏”连接表,名为VulnerObjectTie(带有一个心理FK:VulnerObjectTie.Vulner=Vulner.Id),我无法向其中添加正确的关联。因此,我决定添加以下Linqt

我想咨询一下我面临的一个问题。我开始处理一个非常困难的数据库项目:数据库中的许多表没有主键或有多个PK,因此我无法为edmx中的所有实体添加正确的关联。然而,对于某些实体,这是可能的,我设法做到了。因此,我有两个实体,它们之间有关联:Vulner和VulnerDescription。我有一个Vulner的“坏”连接表,名为VulnerObjectTie(带有一个心理FK:VulnerObjectTie.Vulner=Vulner.Id),我无法向其中添加正确的关联。因此,我决定添加以下LinqtoEntities查询:

            var vulerIdList = from vulner in _businessModel.DataModel.VulverSet.Include("Descriptions")
                    join objectVulnerTie in _businessModel.DataModel.ObjectVulnerTieSet on vulner.Id equals objectVulnerTie.Vulner
                    where softwareId.Contains(objectVulnerTie.SecurityObject)
                    select vulner;
其中description是与VulnerDescription表关联的导航属性。查询可以工作,但不加载Descriptions属性。但是,如果删除联接运算符,则说明将正确加载

此问题最明显的解决方案是将一个查询分为下两个查询:

            var vulerIdList = from vulner in _businessModel.DataModel.VulverSet
                    join objectVulnerTie in _businessModel.DataModel.ObjectVulnerTieSet on vulner.Id equals objectVulnerTie.Vulner
                    where softwareId.Contains(objectVulnerTie.SecurityObject)
                    select vulner.Id;

        var query = from vulner in _businessModel.DataModel.VulverSet.Include("Descriptions")
                    where vulerIdList.Contains(vulner.Id)
                    select vulner;
但我觉得它看起来很丑。有人能为这个问题提出一个更简单的解决方案吗,或者它只是EF4的一个特殊功能


谢谢:)

这是一个已知的“特性”或限制,取决于您如何看待它。这里有一个关于这个主题的有趣的讨论,我相信还有更多的参考文献可以找到:

这里的问题是EF不太适合“坏数据库”。EF(尤其是像ModelWizard这样的所有自动化工具)希望数据库设计清晰、正确

在使用自定义联接或投影的查询中不支持包含。在本例中不受支持意味着它被完全忽略