防止在实体框架中的相关表实体上添加新记录
Posted
技术标签:
【中文标题】防止在实体框架中的相关表实体上添加新记录【英文标题】:Prevent Adding New Record on Related Table Entity in Entity Framework 【发布时间】:2018-02-15 21:53:02 【问题描述】:我正在尝试在我的实体上添加新记录。它工作正常,问题是相关实体也在添加新记录。有没有办法阻止相关实体或二级实体也插入新记录?
这是我的示例实体类:
public Tracking()
public string Details get; set;
//Other properties here..
[Required]
public virtual Employee get; set;
基本上我只是获取现有的员工记录,然后在我的财产上声明它,然后添加跟踪记录:
Employee emp = _dbContext.EmployeeRepo.GetEmployeeByID(1001);
Tracking track = new Tracking()
Details = "My details here",
Employee = emp
_dbContext.TrackingRepo.Add(track);
_dbContext.SaveChanges();
这段代码工作正常,问题是,另一个新的员工记录被插入到我的表 Employee 中。这不是我想要的。我只想在现有员工记录中添加新的 Tracking 记录。
那么有没有办法做到这一点,或者我的 Entity Framework 缺少配置或代码?
【问题讨论】:
【参考方案1】:您需要将员工设置/标记为Unchanged
或Attach
实体
如果您有一个您知道数据库中已经存在但当前没有被上下文跟踪的实体,那么您可以使用DbSet
上的 Attach 方法告诉上下文跟踪该实体。实体在上下文中将处于 Unchanged 状态
context.Employees.Attach(emp);
请注意,如果在未对附加实体进行任何其他操作的情况下调用 SaveChanges
,则不会对数据库进行任何更改。这是因为实体处于 Unchanged 状态。
将现有实体附加到上下文的另一种方法是将其状态更改为未更改。
context.Entry(emp).State = EntityState.Unchanged;
EntityState Enumeration
未更改 对象自附加到上下文或自上次使用 SaveChanges 方法后未被修改 调用。
Entity Framework Add and Attach and Entity States
实体状态和 SaveChanges
实体可以处于 EntityState 枚举定义的五种状态之一。这些状态是:
添加:实体正在被上下文跟踪,但在数据库中尚不存在 未更改:实体正在被上下文跟踪并存在于数据库中,并且其属性值与值没有变化 在数据库中 已修改:实体正在被上下文跟踪并存在于数据库中,其部分或全部属性值已被 修改 已删除:实体正在被上下文跟踪并存在于数据库中,但已被标记为从数据库中删除 下次调用 SaveChanges 时 已分离:上下文未跟踪实体
SaveChanges 对不同状态的实体做不同的事情:
SaveChanges 不会触及未更改的实体。对于处于未更改状态的实体,更新不会发送到数据库。 添加的实体被插入到数据库中,然后在 SaveChanges 返回时变为未更改。 修改后的实体在数据库中更新,然后在 SaveChanges 返回时变为未更改。 已删除的实体将从数据库中删除,然后从上下文中分离。
【讨论】:
哇,我很高兴它有效。我认为我们需要重组整个解决方案。但是如果你不介意,在 NHibernate 等其他 ORM 中,你不需要这样做,如果你有很多这样的属性和实体怎么办,通常这是由必需的数据注释触发的,所以你真的需要一个一个将所有实体设置/标记为未更改?我说的对吗? @WillyDavidJr 如果实体已全部附加,则您不必这样做,但是对于基于 Web 的系统和来自视图模型的系统,您必须确保它们已加载/附加或标记为不变 如果是附加的,那么新记录会添加到我的等效表上,所以所有附加的记录都应该标记为Unchange,这样它就不会添加新记录了对吧? @WillyDavidJr 抱歉通勤自动取款机,很快就会全面更新 好的兄弟,保重。慢慢来,尽管我实施了您的回答并且一切正常,但不要着急。以上是关于防止在实体框架中的相关表实体上添加新记录的主要内容,如果未能解决你的问题,请参考以下文章