Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6-缺少仅主键引用不同表的表_C#_.net_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架6-缺少仅主键引用不同表的表

C# 实体框架6-缺少仅主键引用不同表的表,c#,.net,entity-framework,entity-framework-6,C#,.net,Entity Framework,Entity Framework 6,随着我们离开Linq2Sql,我们正在从NuGet学习实体框架6.1。我们有一小部分表关联两个单独的表,如下所示 EF6数据库第一代 数据库图: 架构概述: 在Visual Studio的空白类库中,首先执行数据库EF6 EDMX文件时,图表仅生成TableA和TableC,而不会生成TableB Visual Studio视图: 您可以看到,只创建了TableA和TableC。从技术上讲,应该创建TableB,因为您希望能够管理这些引用 图中所示的A和C之间的关联: 我觉得我错过了一个选项,或

随着我们离开Linq2Sql,我们正在从NuGet学习实体框架6.1。我们有一小部分表关联两个单独的表,如下所示

EF6数据库第一代

数据库图:

架构概述:

在Visual Studio的空白类库中,首先执行数据库EF6 EDMX文件时,图表仅生成TableA和TableC,而不会生成TableB

Visual Studio视图:

您可以看到,只创建了TableA和TableC。从技术上讲,应该创建TableB,因为您希望能够管理这些引用

图中所示的A和C之间的关联:

我觉得我错过了一个选项,或者误解了实体框架的一个关键概念。知道如何用T4生成缺少的表格B吗?EDMX文件确实显示了它,但由于某些原因,它没有生成到具有两个属性的.CS文件中,这两个属性指示了关系

我们需要这样做的主要原因是,我们扩展了EF6 T4模板,添加了一些工厂模式以匹配现有模型。因为它没有为TableB生成一个类,所以我们没有得到我们正在寻找的自动生成的代码


想法/建议?谢谢。

EF不会生成弱实体或联接表,您需要通过fluent API或使用数据注释手动配置关系

如微软网站所述:根据关系约定:

注意:如果同一类型之间存在多个关系 例如,假设您定义Person和Book类,其中 Person类包含ReviewBooks和AuthoredBooks导航 属性和Book类包含作者和审阅者 导航属性您需要手动配置 通过使用数据注释或fluent API建立关系。更多 有关详细信息,请参见数据注释-关系和Fluent API- 关系

有关更多信息,请参阅此

更新

在EDMX的情况下,一个解决方案将起作用,但其维护成本如下:

从数据库中的联接表中删除外键 从数据库更新EDMX 在联接表中重新创建外键 只要不再从数据库中更新模型,此解决方案就可以工作

推荐的解决方案,保持一切由EDMX生成的状态,并使用用户“@traviswhiden”报告的以下链接了解有关如何在此情况下使用crud操作的更多信息

视频
正如@Hadi Hassan所提到的,EF不会“公开”或识别专门由其他实体组成的关系表

解决办法: 如果您只需要“读取”数据,您可以

在模式中为TableB定义一个视图。 然后执行Model.EDMX更新from DB选择更新视图 现在,您可以使用EF上下文查询TableB数据。 如果需要修改表B中的创建、更新和销毁记录

相应地,在模式中创建存储过程

将过程作为函数导入EF模型

现在,您可以从模型上下文中调用这些函数来执行其余的CRUD操作


我找到的解决这个问题的最简单方法是向表中添加一个自动递增字段,并将此唯一字段作为主键。然后添加由两个外键组成的唯一约束。您可能需要删除该表并重新创建它,以便以这种方式进行设置,因为数据库不喜欢删除现有的PK关系


然后在实体模型中删除该表以及实体可能已创建的与该表中的关系相关的任何导航属性。保存模型,重建,然后从关系图中的数据库更新。您的表现在应该以常规表的形式出现在实体中。

也许EF理解TableB没有自己的意义,只是用于多对多关系?如果我使用代码优先的方法,看起来会很有帮助,但因为我们是从数据库中进行EF Designer,我在EDMX xml中找不到可以设置data fluent api或data Annotation的地方。@Travis您可以做一个变通办法,从联接表中删除主键,在生成EDMX后,将它们放回原处,如果模型因为表中没有主键而无法工作,删除其中一个并尝试删除主键没有帮助,但删除外键约束确实有帮助。但是,在将它们放回原处并查看在按“从数据库更新”时发生的情况后,XML中的关联将返回,并且当您向表中添加实体时,在SaveChanges之后,由于assoc约束,它会引发异常。期望团队中的任何开发人员记住手动删除与ta的所有关联是不合理的
如果他们必须“更新”EDMX文件,则可能会发生错误。因此,尽管这是一个可能的解决方案,但仍然需要一个更易于维护的解决方案。@TravisWhidden您可能会在生成EDMX时保留所有内容,若要了解如何对多对多关系执行crud操作,请查看此链接:@TravisWhidden您还可以观看此视频以了解更多关于多对多关系的信息: