实体类型上的导航尚未添加到模型中,或被忽略,或者实体类型被忽略

时间:2015-12-30 10:09:54

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

  

导航'标签'在实体类型' Notepad.Models.Note'尚未添加到模型中,或忽略,或忽略entityType。

public class Note
    {
        public Note()
        {
            CreationDate = DateTime.Now;
            Tags = new HashSet<Tag>();
            Parts = new HashSet<Part>();
        }

        public int ID { get; set; }
        public virtual ICollection<Tag> Tags { get; set; }
        public virtual ICollection<Part> Parts { get; set; }
        public DateTime? CreationDate { get; set; }
    }


public class Tag
    {
        public Tag()
        {
            Notes = new HashSet<Note>();
        }

        public int ID { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Note> Notes { get; set; }
    }

添加迁移时会发生这种情况:

  

dnx ef migrations添加DbData -c DataDbContext

为什么你认为它会发生?

编辑: DataDbContext:

public class DataDbContext : DbContext
    {
        public DbSet<Note> Notes { get; set; }
        public DbSet<Tag> Tags { get; set; }
        public DbSet<Part> Parts { get; set; }
    }

2 个答案:

答案 0 :(得分:11)

那里有多对多关系。正如文档所说:http://docs.efproject.net/en/latest/modeling/relationships.html#id21

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

所以你必须创造额外的&#34;加入&#34;像这样的课:

public class NoteTag
    {
        public int NoteId { get; set; }
        public Note Note { get; set; }

        public int TagId { get; set; }
        public Tag Tag { get; set; }
    }

然后,替换

 ICollection<Tag> Tags {set;get}

在你的Note课程中

 ICollection<NoteTag> NoteTags {set;get}

以及Tag类:

ICollection<Note> Notes {set;get;}

ICollection<NoteTags> NoteTags {set;get}

然后覆盖DbContext中的OnModelCreating方法:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<NoteTag>()
                .HasKey(t => new { t.NoteId, t.TagId });

            modelBuilder.Entity<NoteTag>()
                .HasOne(pt => pt.Note)
                .WithMany(p => p.NoteTags)
                .HasForeignKey(pt => pt.NoteId);

            modelBuilder.Entity<NoteTag>()
                .HasOne(pt => pt.Tag)
                .WithMany(t => t.NoteTags)
                .HasForeignKey(pt => pt.TagId);
        }

答案 1 :(得分:2)

我使用的是EF 7,这个问题花了我大约2个小时的时间。 :) 所以,这是一个简单的解决方案 - 我有这样的个人资料类 -

[Table("Profile")]
public class Profile
{
    public Profile()
    {

    }

    [Column(Order = 1)]
    [Key]        
    public Guid ProfileID { get; set; }
    [JsonIgnore]
    public virtual ICollection<StudentLivingWith> StudentProfileMap { get; set; }

    [JsonIgnore]
    public virtual ICollection<StudentLivingWith> ParentProfileMap { get; set; }
}

我在另一个名为“StudentLivingWith”的表中使用ProfileID作为F-Key引用。 (是的,我知道这个名字有点奇怪。:))正如你在下面的类中看到的那样,“StudentProfileID”和“ParentProfileID”这两列引用了我的“Profile”表的同一列“profileID”。

[Table("StudentLivingWith")]
public class StudentLivingWith
{
    public StudentLivingWith()
    {

    }

    [Column(Order = 1)]
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int StudentLivingWithID { get; set; }

    [Column(Order = 2)]
    [ForeignKey("StudentProfileID")]
    public Guid StudentProfileID { get; set; }

    [Column(Order = 3)]
    [ForeignKey("ParentProfileID")]
    public Guid ParentProfileID { get; set; }

    [JsonIgnore]
    [InverseProperty("StudentProfileMap")]
    public virtual ICollection<Profile> StudentProfile { get; set; }

    [JsonIgnore]
    [InverseProperty("ParentProfileMap")]
    public virtual ICollection<Profile> ParentProfile { get; set; }
}    

所以结论是 - 你只需要在引用上添加[InverseProperty]标签,这个简单的解决方案对我有用。

我希望这会有所帮助。感谢。