簡體   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