防止在实体框架中添加相关表实体的新记录

时间:2018-02-15 21:53:03

标签: c# entity-framework orm entity-framework-6

我正在尝试在我的实体上添加新记录。它工作正常,问题是,相关实体也在添加新记录。有没有办法阻止相关或第二级实体插入新记录?

这是我的示例实体类:

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。这不是我想要的。我只想在现有员工记录中添加新的跟踪记录。

有没有办法做到这一点,或者我错过了我的实体框架的配置或代码?

1 个答案:

答案 0 :(得分:1)

您需要将员工设置/标记为UnchangedAttach实体

如果您知道某个实体已经存在于数据库中但当前没有被上下文跟踪,那么您可以使用DbSet上的Attach方法告诉上下文跟踪实体。实体将在上下文中处于Unchanged状态

context.Employees.Attach(emp); 

请注意,如果调用SaveChanges而未对附加实体进行任何其他操作,则不会对数据库进行任何更改。这是因为实体处于Unchanged状态。

将现有实体附加到上下文的另一种方法是将其状态更改为Unchanged。

context.Entry(emp).State = EntityState.Unchanged;

EntityState Enumeration

  

未更改该对象尚未被修改,因为它已附加到上下文或自上次SaveChanges方法以来   调用。

Entity Framework Add and Attach and Entity States

实体状态和SaveChanges

实体可以处于EntityState枚举定义的五种状态之一。这些州是:

  
      
  • 补充:实体正在被上下文跟踪,但数据库中尚不存在
  •   
  • 未更改:实体正在被上下文跟踪并存在于数据库中,其属性值未从值更改   在数据库中
  •   
  • 已修改:实体正在被上下文跟踪并存在于数据库中,并且其部分或全部属性值已被   改性
  •   
  • 已删除:实体正在被上下文跟踪并存在于数据库中,但已被标记为从数据库中删除   下次调用SaveChanges
  •   
  • 分离:上下文未跟踪实体
  •   

SaveChanges为不同状态的实体做了不同的事情:

  
      
  • SaveChanges未触及未更改的实体。对于处于Unchanged状态的实体,不会向数据库发送更新。
  •   
  • 添加的实体将插入数据库,然后在SaveChanges返回时变为Unchanged。
  •   
  • 修改后的实体在数据库中更新,然后在SaveChanges返回时变为Unchanged。
  •   
  • 已删除的实体将从数据库中删除,然后从上下文中分离。
  •