エンティティタイプのナビゲーションがモデルに追加されていないか、無視されているか、エンティティタイプが無視されています

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

質問

エンティティタイプ 'Notepad.Models.Note'のナビゲーション 'タグ'がモデルに追加されていないか、無視されているか、エンティティタイプが無視されています。

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移行で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; }
    }

受け入れられた回答

そこに多対多の関係があります。ドキュメントには次のように書かれています。http : //docs.efproject.net/en/latest/modeling/relationships.html#id21

結合表を表すエンティティークラスのない多対多の関係は、まだサポートされていません。ただし、多対多の関係は、結合表のエンティティ・クラスを組み込み、2つの別個の1対多の関係をマッピングすることで表現できます。

したがって、次のように追加の "join"クラスを作成する必要があります。

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}

あなたのノートクラスの

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

人気のある回答

私は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"という名前の別のテーブルでFキー参照としてProfileIDを使用しています。 (名前がちょっと変わっているのは分かっています:))下のクラスでわかるように、「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]タグを追加するだけで済みます。この単純な解決策は私のためのトリックでした。

これが助けてくれるといいなあありがとう。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ