我正在尝试在我的实体上添加新记录。它工作正常,问题是,相关实体也在添加新记录。有没有办法阻止相关或第二级实体插入新记录?
这是我的示例实体类:
public Tracking()
{
public string Details { get; set; }
//Other properties here..
[Required]
public virtual Employee { get; set; }
}
基本上我只是获取现有的Employee记录然后在我的属性上声明它,然后添加跟踪记录:
Employee emp = _dbContext.EmployeeRepo.GetEmployeeByID(1001);
Tracking track = new Tracking()
{
Details = "My details here",
Employee = emp
}
_dbContext.TrackingRepo.Add(track);
_dbContext.SaveChanges();
此代码工作正常,问题是,我的表Employee上插入了另一个新的Employee Record。这不是我想要的。我只想在现有员工记录中添加新的跟踪记录。
有没有办法做到这一点,或者我错过了我的实体框架的配置或代码?
答案 0 :(得分:1)
您需要将员工设置/标记为Unchanged
或Attach
实体
如果您知道某个实体已经存在于数据库中但当前没有被上下文跟踪,那么您可以使用DbSet
上的Attach方法告诉上下文跟踪实体。实体将在上下文中处于Unchanged状态
context.Employees.Attach(emp);
请注意,如果调用SaveChanges
而未对附加实体进行任何其他操作,则不会对数据库进行任何更改。这是因为实体处于Unchanged状态。
将现有实体附加到上下文的另一种方法是将其状态更改为Unchanged。
context.Entry(emp).State = EntityState.Unchanged;
未更改该对象尚未被修改,因为它已附加到上下文或自上次SaveChanges方法以来 调用。
Entity Framework Add and Attach and Entity States
实体状态和SaveChanges
实体可以处于EntityState枚举定义的五种状态之一。这些州是:
- 补充:实体正在被上下文跟踪,但数据库中尚不存在
- 未更改:实体正在被上下文跟踪并存在于数据库中,其属性值未从值更改 在数据库中
- 已修改:实体正在被上下文跟踪并存在于数据库中,并且其部分或全部属性值已被 改性
- 已删除:实体正在被上下文跟踪并存在于数据库中,但已被标记为从数据库中删除 下次调用SaveChanges
- 分离:上下文未跟踪实体
SaveChanges为不同状态的实体做了不同的事情:
- SaveChanges未触及未更改的实体。对于处于Unchanged状态的实体,不会向数据库发送更新。
- 添加的实体将插入数据库,然后在SaveChanges返回时变为Unchanged。
- 修改后的实体在数据库中更新,然后在SaveChanges返回时变为Unchanged。
- 已删除的实体将从数据库中删除,然后从上下文中分离。