同一表多对多连接EF CodeFirst .net Core

问题描述 投票:0回答:1

[嗨,我有一个类似的模型课

    public class Individual : EntityBase
{
    public Individual()
    {
        RelatedIndividuals = new HashSet<RelatedIndividual>();
    }

    public string FirstName { get; set; }

    public string PersonalNumber { get; set; }

    public ICollection<RelatedIndividual> RelatedIndividuals { get; set; }


}

此个人将具有一些具有相关性的个人,我希望在同一个表中具有多对多连接,因此我创建了另一个类

    public class RelatedIndividual
{
    [Column("RelatedIndividualType")]
    public RelatedIndividualType RelatedIndividualType { get; set; }

    [Key, Column(Order = 0)]
    public long IndividualId { get; set; }

    [Key, Column(Order = 1)]
    public long RelatedIndividualId { get; set; }
}

而且我试图在我的contextDB中做

        protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Individual>()
            .HasMany(p => p.RelatedIndividuals)
            .WithMany()
            .Map(m =>
            {
                m.MapLeftKey("IndividualId");
                m.MapRightKey("RelatedIndividualId");
                m.ToTable("RelatedIndividual");
            });
    }

但是我在WithMany上遇到错误

“严重性代码描述项目文件行抑制状态错误CS1061'CollectionNavigationBuilder'不包含'WithMany'的定义,并且找不到可以接受的扩展方法'WithMany'接受类型为'CollectionNavigationBuilder'的第一个参数(您是否缺少using指令或程序集引用?)存储库C: \ Users \ Luka \ Desktop \ Individuals \ Repositories \ Context \ IndividualsDbContext.cs 23活动“

任何建议?如何正确执行?

之后编辑:我尝试过

    public class Individual : EntityBase
{
    public Individual()
    {
        RelatedIndividuals = new HashSet<RelatedIndividual>();
        RelatedIndividualsOf = new HashSet<RelatedIndividual>();
    }

    [MaxLength(50),MinLength(2), Column(TypeName = "nvarchar(50)")]
    public string FirstName { get; set; }
    [MaxLength(50), MinLength(2), Column(TypeName = "nvarchar(50)")]
    public string LastName { get; set; }

    public ICollection<RelatedIndividual> RelatedIndividuals { get; set; }
    public ICollection<RelatedIndividual> RelatedIndividualsOf { get; set; }
}

和我的第二堂课

    public class RelatedIndividual
{
    [Column("RelatedIndividualType")]
    public RelatedIndividualType RelatedIndividualType { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long IndividualId { get; set; }

    [ForeignKey("IndividualId")]
    public Individual Individual { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long RelateIndividualId { get; set; }

    [ForeignKey("RelateIndividualId")]
    public Individual RelateIndividual { get; set; }
}

并且我的上下文看起来像这样

        protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RelatedIndividual>()
.HasKey(e => new { e.IndividualId, e.RelateIndividualId });

        modelBuilder.Entity<RelatedIndividual>()
                   .HasOne(pt => pt.Individual)
                   .WithMany(p => p.RelatedIndividuals)
                   .HasForeignKey(pt => pt.IndividualId);

        modelBuilder.Entity<RelatedIndividual>()
            .HasOne(pt => pt.RelateIndividual)
            .WithMany(t => t.RelatedIndividualsOf)
            .HasForeignKey(pt => pt.RelateIndividualId)
            .OnDelete(DeleteBehavior.Restrict);
    }
<
entity-framework asp.net-core ef-code-first ef-code-first-mapping
1个回答
0
投票
您将如何在单个数据库表中存储此信息?

但是,即使您可以-EF核心也不直接支持多对多关系。您需要定义联接表,以便您具有两个一对多关系。这就是数据库建模的工作方式。

[EF 6确实隐式创建了一个联接表,但幸运的是,EF核心没有]

© www.soinside.com 2019 - 2024. All rights reserved.