Wil*_* Jr 7 c# orm entity-framework entity-framework-6
我正在尝试在我的实体上添加新记录。它工作正常,问题是相关实体也在添加新记录。有没有办法阻止相关或二级实体插入新记录?
这是我的示例实体类:
public Tracking()
{
public string Details { get; set; }
//Other properties here..
[Required]
public virtual Employee { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
基本上我只是获取现有的员工记录,然后在我的财产上声明它,然后添加跟踪记录:
Employee emp = _dbContext.EmployeeRepo.GetEmployeeByID(1001);
Tracking track = new Tracking()
{
Details = "My details here",
Employee = emp
}
_dbContext.TrackingRepo.Add(track);
_dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,问题是,在我的表 Employee 中插入了另一个新员工记录。这不是我想要的。我只想用现有的员工记录添加一个新的跟踪记录。
那么有没有办法做到这一点,或者我的实体框架缺少配置或代码?
您需要将员工设置/标记为Unchanged或Attach实体
如果您知道数据库中已经存在一个实体,但当前上下文尚未跟踪该实体,那么您可以使用 Attach 方法告诉上下文跟踪该实体DbSet。该实体在上下文中将处于 Unchanged 状态
context.Employees.Attach(emp);
Run Code Online (Sandbox Code Playgroud)
SaveChanges请注意,如果在不对附加实体进行任何其他操作的情况下调用,则不会对数据库进行任何更改。这是因为实体处于 Unchanged 状态。
将现有实体附加到上下文的另一种方法是将其状态更改为“Unchanged”。
context.Entry(emp).State = EntityState.Unchanged;
Run Code Online (Sandbox Code Playgroud)
未 更改 该对象自附加到上下文以来或自上次调用 SaveChanges 方法以来尚未被修改。
实体状态和 SaveChanges
实体可以处于 EntityState 枚举定义的五种状态之一。这些状态是:
- 添加:实体正在被上下文跟踪,但数据库中尚不存在
- 未更改:实体正在被上下文跟踪并存在于数据库中,并且其属性值与数据库中的值没有发生变化
- 已修改:实体正在被上下文跟踪并存在于数据库中,并且其部分或全部属性值已被修改
- 已删除:实体正在被上下文跟踪并存在于数据库中,但已被标记为在下次调用 SaveChanges 时从数据库中删除
- 分离:实体没有被上下文跟踪
SaveChanges 对不同状态的实体执行不同的操作:
- SaveChanges 不会触及未更改的实体。对于处于 Unchanged 状态的实体,更新不会发送到数据库。
- 添加的实体将插入到数据库中,然后在 SaveChanges 返回时变为未更改。
- 已修改的实体将在数据库中更新,然后在 SaveChanges 返回时变为未更改。
- 已删除的实体将从数据库中删除,然后从上下文中分离。
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |