//笔记实体 public class Note : IEntity { public long Id { get; set; } = long.Parse($"{DateTime.Now:yyyyMMddHHmmssfffff}"); public string? Name { get; set; } public byte[]? Content { get; set; } public string? Comment { get; set; } public DateTime LastModifiedTime { get; set; } = DateTime.Now; public virtual ICollection<NoteKeyWord> NotesKeyWords { get; set; }=new HashSet<NoteKeyWord>(); }
//关键字实体 public class KeyWord : Bases.IEntityWithName { public int Id { get; set; } public string? Name { get; set; } public virtual ICollection<NoteKeyWord> NotesKeyWords { get; set; }=new HashSet<NoteKeyWord>(); }
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Note>(entity => { entity.HasKey(e => e.Id);//设置主键 entity.Property(e => e.Id).ValueGeneratedOnAdd();//禁止自增 entity.Property(e => e.Name).HasColumnName("Title");//设置列名 }); modelBuilder.Entity<KeyWord>(entity => { entity.HasIndex(e => e.Name).IsUnique();//唯一索引 }); modelBuilder.Entity<NoteKeyWord>(entity=> { entity.HasKey(e=>new { e.NoteId,e.KeyWordId}); //可以不用显示定义外键关系,但建议显示定义 entity.HasOne(e => e.Note).WithMany(n => n.NotesKeyWords).HasForeignKey(e => e.NoteId); entity.HasOne(e => e.KeyWord).WithMany(k => k.NotesKeyWords).HasForeignKey(e => e.KeyWordId); }); }
数据库中已经存在的数据:
public static bool Check() { using NoteDbContext db = new(); var result = db.Notes.Include(n => n.NotesKeyWords).FirstOrDefault(); if (result?.NotesKeyWords.Count > 0) { return true; } return false; }
返回结果为false。
对check代码进行修改:
public static bool Check() { using NoteDbContext db = new(); var result = db.Notes.Include(n => n.NotesKeyWords).FirstOrDefault(); if (result?.NotesKeyWords.Count > 0) { return true; } var result2 = db.NotesKeyWords?.Where(nk => nk.NoteId == result.Id).ToList(); if (result2?.Count > 0) { return true; } return false; }
此时才能得到正确的结果。
请问为什么,不能直接通过result进行验证,通过断点查看,result的NotesKeyWords属性为null。
谁能详细的解释下,我觉得应该是关于导航属性以及追踪等的原理性知识我没搞清楚。
谢谢大神们,我是一个自学的小白!第一次发问!!!
NoteKeyWord这个类是什么啊?还有Bases.IEntityWithName这个基类有是什么啊?
– 唉我干啥啊 3年前