gpt4 book ai didi

c# - 如何根据数据库优先方法(.edmx)的父删除自动删除子?

转载 作者:行者123 更新时间:2023-12-05 07:40:07 27 4
gpt4 key购买 nike

<分区>

以下是我的 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) 在 1 种方法中删除员工和技能,仅保存更改。我想在这种情况下我会获得性能优势,因为我只需要调用一次保存更改,但还有 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) 另一种选择是使用事务来确保 child 和 both 都被成功删除,如下所示:

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) 的情况下,找不到任何关于基于删除父项自动删除子项的帮助。

处理这种情况的有效方法是什么?

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com