繁体   English   中英

如何删除具有外键约束的记录?

[英]How to delete record having foreign key constraint?

这里我有PersonPersonFileUpload表。 PersonFileUpload表将PersonId作为外键,在Person表中是主要的。

现在我想从人员表中删除人员,并在一次删除时从 PersonFileUpload 中删除所有相应的 PersonId。

现在要做到这一点,我尝试将Include()与像这样的人一起使用

var getModel = uow.Repository<Person>().GetAll()
                                       .Where(x => x.PersonId == id)
                                       .Include(x => x.PersonFileUpload)
                                       .FirstOrDefault();

现在的问题是它显示在

uow.Repository<Person>().GetAll()
                        .Where(x => x.PersonId == id)
                        .Include(x => x.PersonFileUpload)
                        .FirstOrDefault()

IEnumerable'不包含'Include'的定义,并且找不到接受'IEnumerable'类型的第一个参数的可访问扩展方法'Include'(您是否缺少 using 指令或程序集引用?)

这是我的删除操作代码:

    public IEnumerable<T> GetAll()
    {
        return _dbset.AsEnumerable();
    }

    public Person GetPersonByIdForDelete(int id)
    {
        var getModel = uow.Repository<Person>().GetAll()
                                               .Where(x => x.PersonId == id)
                                               .Include(x => x.PersonFileUpload)
                                               .FirstOrDefault();           
        return getModel;
    }

    public void DeletePerson(int id)
    {
        var getModel = GetPersonByIdForDelete(id);
        uow.Repository<Person>().Delete(getModel);
        uow.Commit();
    }

对于删除操作,您不需要.Include()查询中的子实体。 您尝试实现的目标可以通过级联删除功能轻松完成 - 当父实体 ( Person ) 被删除时,相关的子实体 ( PersonFileUpload ) 将被自动删除。 您需要做的就是在配置关系时告诉 EF,您想要级联删除此关系。 rest 由数据库处理。

PersonPersonFileUpload之间的关系配置为 -

modelBuilder.Entity<Person>()
    .HasMany(p => p.PersonFileUpload)
    .WithOne(p => p.Person)
    .HasForeignKey(p => p.PersonId)
    .OnDelete(DeleteBehavior.Cascade);

如果您在PersonFileUpload model 中没有Person导航属性,则可以将.WithOne()留空,例如 -

modelBuilder.Entity<Person>()
    .HasMany(p => p.PersonFileUpload)
    .WithOne()
    .HasForeignKey(p => p.PersonId)
    .OnDelete(DeleteBehavior.Cascade);

Person存储库中的删除方法应如下所示 -

public void Delete(int id)
{
    var person = _dbset.Where(x => x.PersonId == id).FirstOrDefault();
    _dbset.Remove(person);
}

现在你可以简单地删除一个Person -

uow.Repository<Person>().Delete(id);
uow.Commit();

并且所有相关的PersonFileUpload都会被自动删除。

你写的代码应该更好。

首先你应该改变GetPersonByIdForDelete()和 Delete Include()

public Person GetPersonByIdForDelete(int id)
    {
        var getModel = uow.Repository<Person>().GetAll()
                                               .Where(x => x.PersonId == id)
                                               .FirstOrDefault();           
        return getModel;
    }

然后添加另一个 class 以查找相关PersonFileUpload

public IEnumerable<Person> GetPersonFileUploadByPersonIdForDelete(int id)
    {
        var getModel = uow.Repository<PersonFileUpload>().GetAll()
                                               .Where(x => x.PersonId == id).ToList();
        return getModel;
    }

最后改变你的最后一个方法:

public void DeletePerson(int id)
    {
        var getModel = GetPersonByIdForDelete(id);
        uow.Repository<Person>().Delete(getModel);
        var getFileUploads = GetPersonFileUploadByPersonIdForDelete(id);
        foreach(var file in getFileUploads)
        {
         uow.Repository<PersonFileUpload>().Delete(file);
        }
        uow.Commit();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM