2017-04-20 86 views
1

我試圖從數據庫中刪除的行全光照這段代碼AsNoTracking和刪除

public ListPicture GetPicture(string Id) 
{ 
    ListPicture pic = Pictures.AsNoTracking().FirstOrDefault(x => x.pId == Id); 
    return pic; 
} 

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
    Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 

卸下我有這樣的錯誤

System.InvalidOperationException:對象不能被刪除,因爲它是沒有在ObjectStateManager中找到。

我試圖附着在實體PIC到圖片

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
     Pictures.Attach(pic); 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 

這是錯誤是:

System.InvalidOperationException:附加類型的實體 'Album.DatabaseContext.ListPicture'因爲另一個相同類型的實體已經具有相同的主鍵值而失敗。

功能Getpicture中多次使用我的應用程序,我怎麼能解決這個問題

+0

您在哪裏以及如何將圖片附加到您的EF環境? –

+0

我添加了附加代碼 – melom

回答

1

嘛,顯然有實體的背景下被跟蹤(加載)。

所以,要麼不使用GetPicture方法(我知道,代碼重複,但...):

ListPicture pic = Pictures.FirstOrDefault(x => x.pId == Id); 
if (pic != null) 
{ 
    Pictures.Remove(pic); 
} 
SaveChanges(); 

,或者如果PicturesDbSet<T>(因爲它從發佈的代碼似乎),你可以使用Find方法來代替:

ListPicture pic = Pictures.Find(Id); 
if (pic != null) 
{ 
    Pictures.Remove(pic); 
} 
SaveChanges(); 

這兩種方法都將確保返回的實例被附加到上下文。

+0

這是我的想法,我不想重複代碼 - 謝謝 – melom

0

當您使用AsNoTracking時,EF不會維護已加載到代理的實體的數據。也就是說,它是一個不再依賴EF進行任何事情的實體。

但是,該實體存在於數據庫中。 當試圖執行附件時,EF會檢查是否已經存在具有相同標識的人並引發異常。

我的建議是:

1:刪除從Getpicture中方法AsNoTracking。 2:如果你不能,讓你的刪除方法是這樣的:

public ListPicture GetPicture(string Id) 
{ 
    ListPicture pic = Pictures.AsNoTracking().FirstOrDefault(x => x.pId == Id); 
    return pic; 
} 

public void DeletePicture(string Id) 
{ 
    ListPicture pic = Pictures.Find(id); 
    if(pic != null) 
    { 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); 
} 
0

如果你不知道是否會(在你得到它可以是或例外和基於)被連接或不那麼你可以在DbContext實例上添加一個檢查來查看它是否被附加,如果不是,則附加它。這需要訪問正在使用的DbContext實例。

或者確保您總是返回一個附屬實體,並且不要使用AsNoTracking()

public void DeletePicture(string Id) 
{ 
    ListPicture pic = GetPicture(Id); 
    if(pic != null) 
    { 
     // add check if instance is attached 
     if(contextInstance.Entry(pic).State == System.Data.Entity.EntityState.Detached) 
     Pictures.Attach(pic); 
     Pictures.Remove(pic); 
    } 
    SaveChanges(); // this could be moved to inside the if block 
}