6

Die Navigation 'Tags' zum Entitätstyp 'Notepad.Models.Note' wurde dem Modell nicht hinzugefügt oder ignoriert. oder entityType ignoriert.Die Navigation zum Entitätstyp wurde nicht zum Modell hinzugefügt oder ignoriert, oder Entitätstyp ignoriert

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; } 
    } 

kommt es vor, während eine Migration fügt hinzu:

dnx ef Migrationen hinzufügen DBData -c DataDbContext

Warum denken Sie, es passiert?

EDIT: DataDbContext:

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

Zeigen Sie den Code für 'Tag' an – dotctor

+1

Haben Sie DbSet zu DataDbContext hinzugefügt? –

+0

@MarcinZablocki Ich habe es auf die Frage eingefügt, können Sie sehen, ob alles korrekt ist – Piotrek

Antwort

11

Sie haben Many-to-many dort Beziehung. Da die Dokumentation sagt: http://docs.efproject.net/en/latest/modeling/relationships.html#id21

Many-to-many-Beziehungen ohne Entitätsklasse die Join-Tabelle zu repräsentieren, werden noch nicht unterstützt. Sie können jedoch eine Viele-zu-Viele-Beziehung darstellen, indem Sie eine Entitätsklasse für die Join-Tabelle einschließen und zwei separate Eins-zu-Viele-Beziehungen zuordnen.

So müssen Sie zusätzliche "join" Klasse wie folgt erstellen:

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

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

dann ersetzen

ICollection<Tag> Tags {set;get} 

in Ihrer Anmerkung Klasse

ICollection<NoteTag> NoteTags {set;get} 

und auch in Tag Klasse:

ICollection<Note> Notes {set;get;} 

zu

ICollection<NoteTags> NoteTags {set;get} 

und dann außer Kraft setzen OnModelCreating Methode in DbContext:

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); 
     } 
+0

danke, es scheint wie Migration erfolgreich durchgeführt wurde. Aber es ist sehr seltsam, ich bin mir sicher, dass ich viele Beziehungen zu vielen im Entity Framework – Piotrek

+0

@ Ludwik11 Ja in EF6, aber nicht EF7, auch nur über diesen Fehler stolpernd und dachte, warum funktioniert ein anderes N zu M Arbeit habe ich hier , dann habe ich seine zwei 1 zu N mit einer Bridge-Tabelle realisiert, weil diese Tabelle eine zusätzliche Eigenschaft hat! – Pascal

2

I EF bin mit 7, dieses Problem dauerte etwa 2 Stunden meiner Woche Ende. :) So, hier ist die einfache Lösung - Ich bin ein Profil Klasse wie folgt mit -

[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; } 
} 

ich die Profileid als F-Key Referenz bin mit meiner anderen Tabelle mit dem Namen „StudentLivingWith“. (ya, ich weiß, der Name ist etwas seltsam. :)) Wie Sie in der unteren Klasse sehen können, verweisen beide Spalten "StudentProfileID" und "ParentProfileID" auf die gleiche Spalte "ProfilID" meiner "Profil" -Tabelle.

[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; } 
}  

So die Schlussfolgerung ist - Sie müssen nur [InverseProperty] Tag auf den Verweis hinzuzufügen, und diese einfache Lösung der Trick für mich getan hat.

Ich hoffe, das wird helfen. Vielen Dank.