[小技巧]EF Core中如何获取上下文中操作过的实体

在使用EF Core的UnitOfWork模式时,如何在事务中获取其他Repository操作的关联实体是一个挑战。本文通过背景介绍和问题说明,探讨了两种解决方案:从ChangeTracker获取和使用Find方法。ChangeTracker能记录操作过的实体,但可能不包含未保存到数据库的新增实体,而Find方法会先检查ChangeTracker,找不到时再查询数据库,提供了更优的解决方案。
摘要由CSDN通过智能技术生成

原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html
作者:Lamond Lu
源代码:https://github.com/lamondlu/EFCoreFindSample

背景介绍

当我们在工作单元(UnitOfWork)中使用EF/EF Core的时候,为了要保持事务,一个用户操作只能调用一次SaveChange方法,但是有时候一个用户操作需要调用多个Repository,并且他们操作的实体是关联的。这时候在一个Repository中获取另外一个Repository中添加/修改/删除的实体就变成了一个问题。

问题说明

当前我们做一个学生管理系统,学生和班之间是多对多关系,一个学生可以属于多个班, 因此我们创建了如下的EF上下文。

	public class TestDbContext : DbContext
    {

        public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
        {

        }

        public DbSet<Student> Students { get; set; }

        public DbSet<Group> Groups { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<StudentGroup>().HasKey(p => new { p.GroupId, p.StudentId });

            base.OnModelCreating(modelBuilder);
        }
    }


    [Table("Student")]
    public class Student
    {
        public Student()
        {
            StudentGroups = new List<StudentGroup>();
        }

        [Key]
        public Guid StudentId { get; set; }

        public string Name { get; set; }

        public int Credits { get; set; }

        public virtual ICollection<StudentGroup> StudentGroups { get; set; }
    }

    [Ta
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值