【问题标题】:Entity Framework creates a table I don't want实体框架创建了一个我不想要的表
【发布时间】:2017-06-23 09:00:52
【问题描述】:

我正在使用实体框架代码优先方法在我的应用程序中进行数据访问。我有一个表Web_Documents 和一个表Web_Profils 和一个关系表Web_Profil_joint_Documents,所有这些我都为它们制作了POCO。我的问题是当我添加迁移时,实体框架创建了一个额外的关系表。现在在我的上下文中,我在两者之间进行如下绑定:

modelBuilder.Entity<Web_Profils>()
    .HasMany<Web_Documents>(p => p.Documents)
    .WithMany(d => d.Profils)
    .Map(Web_Profil_joint_Documents =>
    {
        Web_Profil_joint_Documents.MapLeftKey("IDProfil");
        Web_Profil_joint_Documents.MapRightKey("IDDocument");
        Web_Profil_joint_Documents.ToTable("Web_Profil_joint_Documents");
    });

但我认为这会添加一个新表,并且由于我已经有 Web_Profil_joint_Documents 它会创建 Web_Profil_joint_Documents1 并将数据添加到第一个表,实际上填充了第二个表。我已经尝试将表格逆向工程到我的模型,但这只会造成一团糟。我还尝试删除 SQL Server Management 中的表,然后手动修改迁移以仅具有 Web_Profil_joint_Documents 但每次都有错误。

这段代码会创建一个新表吗?我认为它会在两个表之间添加多对多关系并将其添加到已经存在的关系表中。

任何想法如何解决这个问题?

【问题讨论】:

  • 从逻辑上讲,您不能拥有Web_Profil_joint_Documents 的“实例”,因此它不应该存在于您的代码优先实体模型中。让实体框架处理多对多关系表。
  • @AmitJoshi 那真是令人沮丧:(
  • @ChrisPickford 所以在我的上下文中也没有DbSet&lt;Web_Profil_joint_Documents&gt;?做你说的我会尝试是有意义的。唯一的问题是如何测试关系?假设我想找到关系表的第 1 行,或者 ID = 1 等的行。 ?
  • @LéonardLaiter 为什么要查找个人 ID?一切都可以通过相关的实体实例来实现。
  • 这并不完全正确。您几乎可以控制 EF 的任何方面(至少在模式管理中)。是的,除了半连接场景外,您几乎不需要直接访问连接表,但您仍然可以通过导航属性做到这一点。如果要控制连接表,请配置两个一对多关系,因为 .Map 函数需要一个映射,因此将定义一个具有唯一名称的连接表,因为连接对象已经是上下文图的一部分。

标签: c# asp.net sql-server entity-framework


【解决方案1】:

您不应该为多对多关系定义相关实体 POCO 类。实体框架会自动为我们生成它。从评论中我知道你为什么要定义关系实体。

相关实体将包含两列。

  1. Web_Profils 的主键
  2. Web_Documents 的主键。

到目前为止,一切都很简单。现在您想访问关系表中的数据(这是非常非常罕见的),那么您可以这样做。

假设您有 web_profile 的实例,并且您想在关系中获取它的记录,那么第一列是实例的 id(主键),第二列您可以通过选择其相关集合的 Web_Profil_joint_Documents 的 id 来获取它。

Web_Profils.Web_Profil_joint_Documents.Select(d => d.Id)

这样你也可以实现关系表的第二列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    相关资源
    最近更新 更多