【发布时间】:2017-09-27 14:49:01
【问题描述】:
以下是我的 2 个班级分享一对多的关系:
public partial class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Skills> Skills { get; set; }
}
public partial class Skills
{
public int Id { get; set; }
public Nullable<int> EmployeeId { get; set; }
public string Skills { get; set; }
public virtual Employee Employee { get; set; }
}
现在我正在尝试通过以下方式删除具有相应技能的员工:
1) 用一种方法删除员工和技能,只保存更改。我想在这种情况下我将获得性能优势,因为我只需要调用一次保存更改,但还有一个问题是,如果技能被删除,但如果在这种情况下删除员工时发生错误,我会失去对应员工的技能。
public void Delete(int[] ids)
{
using (var context = new MyEntities())
{
context.Skills.RemoveRange(context.Skills.Where(cd => ids.Contains(cd.EmployeeId)));
context.Employee.RemoveRange(context.Employee.Where(t => ids.Contains(t.Id)));
context.SaveChanges();
}
}
2) 另一种选择是使用事务来确保成功删除和孩子,如下所示:
public HttpResponseMessage Delete(int[] ids)
{
using (var context = new MyEntities())
{
using (var transaction = context.Database.BeginTransaction())
{
try
{
DeleteSkills(ids,context);
DeleteEmployees(ids,context);
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
// throw exception.
}
}
}
}
public void DeleteEmployees(int[] ids,MyEntities _context)
{
_context.Employee.RemoveRange(_context.Employee.Where(t => ids.Contains(t.Id)));
_context.SaveChanges();
}
public void DeleteSkills(int[] ids, MyEntities _context)
{
_context.Skills.RemoveRange(_context.Skills.Where(cd => ids.Contains(cd.EmployeeId)));
_context.SaveChanges();
}
3) 我正在寻找一个选项,我不需要显式删除子(技能),并且子会根据父(员工)实体的删除自动删除,就像代码优先级联时发生的方式一样删除,这样我就不必触发 2 个查询来删除父项和子项(我的第一个选项),或者我不必维护事务(我的第二个选项。)
我做了一些研究,但在 数据库优先方法 (.edmx) 的情况下,无法根据删除父级自动删除子级的任何帮助。
什么是处理这种情况的有效方法?
【问题讨论】:
-
相信
DbContext.SaveChanges本身是使用事务的,所以不用担心case 1的部分删除 -
为什么不使用这样的 SQL Cascade 删除行为 stackoverflow.com/a/37459049/2946329
-
嗨学习。我注意到您的帖子存在许多问题,可以通过一些小的更改来避免这些问题。请您回答这些问题好吗? (1) 提及自己时,请始终使用大写的“I”。以英语为母语的读者通常会觉得读“i”很烦人,而这种轻微的挫败感会妨碍提供帮助。 (2) wasn't, could't, don't, doesn't 等词的最后一个字母前都有撇号。您是否可以在键入时添加它,或者在您的计算机上启用自动更正?
-
(3) 您的每个问题都附有“谁能帮助我?”这个问题。当然,答案通常只是“是”,但这不是您要寻求的回应。文章Why is “Can someone help me?” not an actual question? 在这里很有帮助。如果您可以将该短语与更具体的问题交换,那就太好了,否则请不要使用它。谢谢!
-
为什么重新提出这个问题?我认为提议的副本是正确的。如果不是,那this one 呢?关键部分是数据库中的 FK 应该指定了级联删除。
标签: c# entity-framework edmx ef-database-first