La navegación en el tipo de entidad no se ha agregado al modelo, ni se ha ignorado, o se ha ignorado entityType

asp.net-core c# dnx entity-framework entity-framework-core

Pregunta

Las 'Etiquetas' de navegación en el tipo de entidad 'Notepad.Models.Note' no se han agregado al modelo, ni se han ignorado, o se ha ignorado el tipo de entidad.

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

Sucede al agregar una migración:

las migraciones de dnx ef agregan DbData -c DataDbContext

¿Por qué crees que sucede?

EDIT: DataDbContext:

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

Respuesta aceptada

Tienes una relación de muchos a muchos allí. Como dice la documentación: http://docs.efproject.net/en/latest/modeling/relationships.html#id21

Las relaciones de muchos a muchos sin una clase de entidad para representar la tabla de unión aún no son compatibles. Sin embargo, puede representar una relación de muchos a muchos incluyendo una clase de entidad para la tabla de unión y asignando dos relaciones separadas de uno a varios.

Así que debes crear una clase de "unión" adicional como esta:

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

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

entonces, reemplace

 ICollection<Tag> Tags {set;get}

en tu clase de notas para

 ICollection<NoteTag> NoteTags {set;get}

y también en la clase de etiqueta:

ICollection<Note> Notes {set;get;}

a

ICollection<NoteTags> NoteTags {set;get}

y luego anular el método OnModelCreating en 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);
        }

Respuesta popular

Estoy usando EF 7, este problema tomó aproximadamente 2 horas de mi fin de semana. :) Entonces, aquí está la solución simple: estoy teniendo una clase de perfil como esta:

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

Estoy usando ProfileID como referencia de clave F en mi otra tabla llamada "StudentLivingWith". (ya, sé que el nombre es un poco extraño. :)) Como se puede ver en la siguiente clase, tanto las columnas "StudentProfileID" como "ParentProfileID" se refieren a la misma columna "profileID" de mi tabla de "Perfil".

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

Entonces, la conclusión es: solo necesita agregar la etiqueta [InverseProperty] en la referencia, y esta solución simple hizo el truco por mí.

Espero que esto sea de ayuda. Gracias.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué