如何根据数据库第一种方法(.EDMX)自动删除儿童



以下是我的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关系。

最新更新