[英]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.