以下是我的2类共享1与许多关系:
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)另一种选择是使用交易来确保成功地删除和孩子一样,如下所示:
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)的情况下,基于父母的删除自动删除孩子时找不到任何帮助。
什么是处理这种情况的有效方法?
ef如果删除一个或另一个实体,则在中间表中自动删除中间表中的相关记录。
因此,ef默认情况下启用了所有实体的级联删除效果。
如果您想手动处理可以使用:
.WillCascadeOnDelete(false);
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<parent>()
.HasOptional<child>(c => c.child)
.WithMany()
.WillCascadeOnDelete(false);
}
阅读有关实体框架中删除行为的阅读。
您可以选择启示在删除上的行为方式,以便它会影响儿童/依赖。
在您的情况下,您需要"级联"删除行为,这些行为会自动删除您要删除的实体的儿童/家属。
在您中这样做的方法:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PARENT>()
.........
.OnDelete(DeleteBehavior.Cascade);
}
在此处查看如何使用以及有关的内容:
https://entityframeworkcore.com/saving-data-cascade-delete#:~: text = entity framework Core Cascade Cascade Delete Delete&text=cascade DELETE DELETE DELETE ALLOWS ALLOWS ALLOWS THETTHETETEM20DELETIOM 20BEETELION,DELETIEM 20BEEDELETIMION gehavavi;20 of%20个个人%20关系。