【EF Core】实体追踪——Entry中记载的数据 [复制链接]
发表于 2026-2-13 03:22:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
这回终于可以 Free 了,刚好快过年了,工厂的呆板也很人性化地坏了,须要供应商维修,不消测试项目了。以是老周也回家快活了几天。实在他们自己有开发团队,小改小测的他们完全可以自己弄,非要找老周贫苦。
咱们接着前次的话题聊,前次老周给大搭档们胡诌了一番有关实体状态追踪的底子。这一次咱们把留意力放到名为 EntityEntry 的对象上。咦,这名怎么看着这么奇葩?咱们不管它奇不奇葩,只要知道它负责生存实体对象的属性值就行了。
毕竟实体类通常就是一个平常类,EF Core 须要状态追踪功能,总不能让开发者自己去跟踪吧,以是,EF 内部会用字典数据结构来生存实体的各个属性的值。字典是个好东西,啥都能放。偶尔候在写 Web API 时,一些返回 JSON 结构是动态的,为它们都界说一个类来序列化是不明智的,直接拼装 JSON 有点贫苦,这时间用字典就很爽。
当实体从数据库查询出来时,EF 先为实体对象创建一个快照,表明它的原始数据。然后,当你对实体举行各种搔利用之后,调用一下 DetectChanges 方法,它会扫描实体对象各个属性的值,并和当初创建的快照比力,以确定实体是否被修改(或删除)。
为了让初学的大搭档们好明白,咱们做个对比实验。
假设有这么个实体类,它表现一本书的信息。
  1. public class Book{    public int BookId { get; set; }    public string Name { get; set; } = null!;    public string ISBN { get; set; } = null!;    public string Author { get; set; } = null!;    public int PubYear {  get; set; }}
复制代码
然后是实现数据库上下文。
[code]public class MyDb : DbContext{    public DbSet Books { get; set; }    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)    {        optionsBuilder.UseSqlite("data source=shop.db");    }    protected override void OnModelCreating(ModelBuilder modelBuilder)    {        var bookEnt = modelBuilder.Entity();        // 主键名称        bookEnt.HasKey(x => x.BookId).HasName("PK_Book");        // 字符串长度        bookEnt.Property(a => a.Name).HasMaxLength(65);        bookEnt.Property(b => b.Author).HasMaxLength(20);        bookEnt.Property(c => c.ISBN).HasMaxLength(15);        bookEnt.ToTable("tb_Books", t =>        {            // 束缚            t.HasCheckConstraint("CK_Pubyear", "\"PubYear\" >= 2020 AND \"PubYear\"
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表