C# 在实体框架中配置多对多关系时出现问题

C# 在实体框架中配置多对多关系时出现问题,c#,asp.net-mvc,entity-framework,code-first,ef-fluent-api,C#,Asp.net Mvc,Entity Framework,Code First,Ef Fluent Api,我试图用代码优先的EF6从数据库复制m-m关系,但没有成功。我尝试了一些教程链接和这里的一些答案,但仍然得到相同的错误 这只是我尝试过的几件事: 错误:实体类型“AdjustmentType”和“AdjustmentReason”无法共享表“AdjustmentReason”,因为它们不在同一类型层次结构中,或者它们之间没有有效的一对一外键关系,并且主键匹配 谢谢 一些可能有帮助的改动 public class AdjustmentType : AuditableEntity { //Good

我试图用代码优先的EF6从数据库复制m-m关系,但没有成功。我尝试了一些教程链接和这里的一些答案,但仍然得到相同的错误

这只是我尝试过的几件事:

错误:实体类型“AdjustmentType”和“AdjustmentReason”无法共享表“AdjustmentReason”,因为它们不在同一类型层次结构中,或者它们之间没有有效的一对一外键关系,并且主键匹配

谢谢


一些可能有帮助的改动

public class AdjustmentType : AuditableEntity
{ //Good...
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AdjustmentTypeId { get; set; }

    [Column("AdjustmentType")]
    [StringLength(50)]
    public string AdjustmentType1 { get; set; }

    public virtual ICollection<AdjustmentReasonType> AdjustmentReasonType { get; set; }
}

public class AdjustmentReason : AuditableEntity
{ //Good...
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int AdjustmentReasonId { get; set; }

    [Column("AdjustmentReason")]
    [StringLength(50)]
    public string AdjustmentReason1 { get; set; }

    public bool? Hidden { get; set; }

    public ICollection<Transaction> Transactions { get; set; }
    public virtual ICollection<AdjustmentReasonType> AdjustmentReasonType { get; set; }      
}

public class AdjustmentReasonType : AuditableEntity
{ // Remove the FKs...
    public int AdjustmentReasonTypeId { get; set; }

    //public int AdjustmentReasonId { get; set; } //This is required

    //public int AdjustmentTypeId { get; set; } //This is optional

    public virtual AdjustmentType AdjustmentType { get; set; }

    public virtual AdjustmentReason AdjustmentReason { get; set; }

}

//DatabaseContext.cs
// Add the FK declarations here so that EF knows how to resolve these back to the parent references.

        modelBuilder.Entity<AdjustmentReason>()
            .HasMany(e => e.AdjustmentReasonTypes)
            .WithRequired(e => e.AdjustmentReason)
            .Map(e=> e.MapKey("AdjustmentReasonId"); // FK column name.
        modelBuilder.Entity<AdjustmentType>()
            .HasMany(e => e.AdjustmentReasonType)
            .WithRequired(e => e.AdjustmentType)
            .Map(e=> e.MapKey("AdjustmentTypeId");

//IDatabaseContext.cs
        IDbSet<AdjustmentReason> AdjustmentReasons { get; set; }

        IDbSet<AdjustmentType> AdjustmentTypes { get; set; }
        // Remove these, typically you would be dealing with Reasons or Types, not the linking table directly. Use the references
        //IDbSet<AdjustmentReasonType> AdjustmentReasonTypes { get; set; }

找到了错误的解决方案! 事实证明,我在类的数据注释中将AdjustmentReason和AdjustmentType都命名为Schema.AdjustmentReason。我已经更新了问题区域中的代码,以显示两个类中的数据注释错误

之前:

[Serializable]
[Table("schema.AdjustmentReason")]
public class AdjustmentType : AuditableEntity

[Serializable]
[Table("schema.AdjustmentReason")]
public class AdjustmentReason : AuditableEntity
之后:

[Serializable]
[Table("schema.AdjustmentType")]
public class AdjustmentType : AuditableEntity

[Serializable]
[Table("schema.AdjustmentReason")]
public class AdjustmentReason : AuditableEntity
这是帮助我认识到我做错了什么的链接:

我很抱歉没有把数据注释放在前面,我不认为它是必要的,为此我很抱歉


谢谢

看起来不错,除了你的第一个modelBuilder可能有一个输入错误,我认为应该是AdjustmentReasonType,没有HasMany lambda中的s。感谢Ivan在AdjustmentTrason中进行了修复,这样集合名称就没有sThanks Steve Py了。我已经做了建议的修改,但仍然得到相同的错误。
[Serializable]
[Table("schema.AdjustmentType")]
public class AdjustmentType : AuditableEntity

[Serializable]
[Table("schema.AdjustmentReason")]
public class AdjustmentReason : AuditableEntity