【问题标题】:Entity Framework Core: many-to-many relationship with same entityEntity Framework Core:与同一实体的多对多关系
【发布时间】:2016-09-29 13:33:57
【问题描述】:

我正在尝试将多对多关系映射到同一个实体。 User 实体有一个IList<User> 数据字段用于Contacts,用于存储用户的联系人/朋友信息:

public class User : DomainModel
{
    public virtual IList<User> Contacts { get; protected set; }
    //irrelevant code omitted
}

当我尝试使用 fluent API 来映射这种多对多关系时,它给我带来了一些麻烦。显然,当我在user.Contacts 属性上使用HasMany() 时,它没有WithMany() 方法可以调用下一个。 Visual Studio 的智能感知仅显示 WithOne(),但不显示 WithMany()

modelBuilder.Entity<User>().HasMany(u => u.Contacts).WithMany() 
// gives compile time error: CS1061 'CollectionNavigationBuilder<User, User>' does not contain a definition for 'WithMany' and no extension method 'WithMany' accepting a first argument of type 

那么为什么会这样呢?在映射这种多对多关系时我做错了什么吗?

【问题讨论】:

标签: c# linq asp.net-core .net-core entity-framework-core


【解决方案1】:

那么为什么会这样呢?我做错了什么来映射这个 多对多关系?

不,你没有做错任何事。 It's just not supported。当前状态here

没有实体类来表示的多对多关系 尚不支持连接表。但是,您可以代表一个 通过包含连接的实体类来实现多对多关系 表和映射两个单独的一对多关系。

使用 EF-Core,您应该为映射表创建实体。如UserContactsdocs 中的完整示例,如 cmets 中所述。我还没有实际测试过下面的代码,但它应该看起来像这样:

public class UserContacts
{
    public int UserId { get; set; } 
    public virtual User User { get; set; }

    public int ContactId { get; set; } // In lack of better name.
    public virtual User Contact { get; set; }
}

public class User : DomainModel
{
    public List<UserContacts> Contacts { get; set; }
}

还有你的modelBuilder

  modelBuilder.Entity<UserContacts>()
        .HasOne(pt => pt.Contact)
        .WithMany(p => p.Contacts)
        .HasForeignKey(pt => pt.ContactId);

    modelBuilder.Entity<UserContacts>()
        .HasOne(pt => pt.User)
        .WithMany(t => t.Contacts)
        .HasForeignKey(pt => pt.UserId);

【讨论】:

  • 在第一个modelBulder.Entity中,应该是“.WithMany(p => p.Users)”而不是“.WithMany(p => p.Contacts)”吗?
  • @CarlosAdrián - 我不这么认为。因为它是对同一张表的引用。它仍然是一个有多个联系人的用户。联系人仍然是用户。
  • 这个解决方案对我不起作用。相反,我找到了一个类似问题的以下答案,为我解决了多对多自引用问题:stackoverflow.com/a/49219124/430742
  • @Jpsy 是的,你是对的。现有答案不正确。现有答案仅适用于两种不同类型之间的多对多,而不适用于同一类型。我已经修改了答案。现在它将适用于相同的类型。
  • @TanvirArjel:抱歉,我还没有看到你的编辑。您是否正确保存了更改?目前,此答案的最后一次编辑是从 2017 年 2 月 25 日开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
相关资源
最近更新 更多