首页 新闻 会员 周边 捐助

EFCore中多对多关系的级联查询

0
[待解决问题]
//笔记实体
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。

谁能详细的解释下,我觉得应该是关于导航属性以及追踪等的原理性知识我没搞清楚。

 

谢谢大神们,我是一个自学的小白!第一次发问!!!

IdealAnt的主页 IdealAnt | 菜鸟二级 | 园豆:202
提问于:2021-09-11 12:13

NoteKeyWord这个类是什么啊?还有Bases.IEntityWithName这个基类有是什么啊?

唉我干啥啊 3年前
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册