[英]How to delete record having foreign key constraint?
这里我有Person
和PersonFileUpload
表。 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 由数据库处理。
将Person
和PersonFileUpload
之间的关系配置为 -
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.