2009-08-01 197 views
14

我得到「該對象無法刪除,因爲它沒有在ObjectStateManager中找到」。同時刪除對象。實體框架刪除對象問題

這裏是代碼;

//first i am filling listview control. 
private void Form1_Load(object sender, EventArgs e) 
    { 
     FirebirdEntity asa = new FirebirdEntity(); 

     ObjectQuery<NEW_TABLE> sorgu = asa.NEW_TABLE; 

     foreach (var item in sorgu) 
     { 
      ListViewItem list = new ListViewItem(); 
      list.Text = item.AD; 
      list.SubItems.Add(item.SOYAD); 
      list.Tag = item; 
      listView1.Items.Add(list); 

     } 
//than getting New_table entity from listview's tag property. 
private void button3_Click(object sender, EventArgs e) 
    { 

      using (FirebirdEntity arama = new FirebirdEntity()) 
      { 

       NEW_TABLE del = (NEW_TABLE)listView1.SelectedItems[0].Tag; 
       arama.DeleteObject(del); 
       arama.SaveChanges(); 


      }} 

回答

28

您需要的對象attachObjectContext。請嘗試:

NEW_TABLE del = (NEW_TABLE)listView1.SelectedItems[0].Tag; 
arama.Attach(del); 
arama.DeleteObject(del); 
arama.SaveChanges(); 

附加對象由ObjectContext跟蹤。這是執行刪除和更新所必需的。您可以在MSDN上閱讀有關attaching objects的更多信息。

編輯澄清安裝/拆卸:

private void Form1_Load(object sender, EventArgs e) { 
    FirebirdEntity asa = new FirebirdEntity(); 

    ObjectQuery<NEW_TABLE> sorgu = asa.NEW_TABLE; 
    foreach (var item in sorgu) { 
     asa.Detach(item); 
     // add to listView1 
    } 
} 

此外,你應該包裝在using塊你的ObjectContext的使用。

+0

我現在得到這個錯誤;一個實體對象不能被IEntityChangeTracker的多個實例引用。 – 2009-08-01 17:44:27

+0

您需要將它從提供給實體的ObjectContext中分離出來。以對象作爲參數調用ObjectContext.Detach。 – jason 2009-08-01 17:53:45

5

在你的方法「Form1_Load的」您創建「FirebirdEntity」背景下的第一個實例的填寫與此背景下

在你的方法「button3_Click」創建一個新的,第二個實例選擇實體ListViewItem的你「FirebirdEntity」上下文。然後嘗試刪除在第一個上下文中選擇的SECOND上下文中的實體。

在你的兩個方法中使用你的上下文的相同實例,一切都會正常工作。

(或者你可以選擇你想從你的第二個情境中刪除,然後刪除該實體,而不是產地之一的實體)

2
通常

在數據庫中刪除我用這種LINQ查詢,總是除非你有外鍵約束:

int id = convert.toint32(some text field from the page); 
entity data = new entity(); 
var del = (from record in data.records 
      where record.id == id 
      select record).FirstOrDefault(); 
data.deleteObject(del); 
data.saveChanges(); 

希望這會有所幫助。

3

我在我的DomainService方法中運行了一個linq查詢,然後從結果中刪除,因此,當下面的第一個代碼段失敗,出現錯誤「該對象無法刪除,因爲它在ObjectStateManager中找不到」,第二個代碼段工作。

public void DeleteSharedDoc(SharedDocs shareddoc) 
{ 
     this.ObjectContext.SharedDocs.DeleteObject(shareddoc); 
} 

這工作:

public void DeleteSharedDoc(SharedDocs shareddoc) 
{ 
var query = (from w in this.ObjectContext.SharedDocs 
      where w.UserShareName == shareddoc.UserShareName 
      && w.UserShareUsersEmail == shareddoc.UserShareUsersEmail 
      && w.DocumentId == shareddoc.DocumentId 
      select w).First(); 
this.ObjectContext.SharedDocs.DeleteObject(query); 
} 
2

假設我有一個名爲處的一個對象,一個surrogatekey DepartmentUUID

DDL看起來是這樣的:

CREATE TABLE [dbo].[Department] 
    ( 
      DepartmentUUID [UNIQUEIDENTIFIER] NOT NULL 
     , DepartmentName varchar(24) not null 
     , CreateDate smalldatetime not null 
    ) 
GO 


ALTER TABLE [dbo].[Department] ADD CONSTRAINT PK_Department PRIMARY KEY NONCLUSTERED (DepartmentUUID) 
GO 

ALTER TABLE [dbo].[Department] ADD CONSTRAINT CK_DepartmentName_Unique UNIQUE (DepartmentName) 
GO 

ALTER TABLE [dbo].[Department] ADD CONSTRAINT [DF_Department_DepartmentUUID] DEFAULT (NEWSEQUENTIALID()) FOR DepartmentUUID 
GO 

ALTER TABLE [dbo].[Department] ADD CONSTRAINT [DF_Department_CreateDate] DEFAULT (CURRENT_TIMESTAMP) FOR CreateDate 
GO 

現在的實體框架碼。重要的部分是: 1.使用AttachTo方法。 2.創建一個臨時對象,並設置它的主鍵值。 (代理鍵)。

public int DeleteDepartment(Guid departmentUUID) 
{ 

    int returnValue = 0; 

    Department holder = new Department(); 
    holder.DepartmentUUID = departmentUUID; // DepartmentUUID is the primary key of this object (entity in the db) 

    using (MyContectObject context = new MyContectObject()) 
    { 
     context.AttachTo("Departments", holder); 

     context.DeleteObject(holder); 

     int numOfObjectsAffected = context.SaveChanges(); 
     returnValue = numOfObjectsAffected; 

     context.Dispose(); 
    } 

    return returnValue; 

} 
1

的令人作嘔的可怕黑客我用的是這樣的:

var attachedObject = _repository.GetObjectByKey(detachedObject.EntityKey); 

工程進行了大量的這些問題。我希望能夠通過這裏找到更加優雅的解決方案。這似乎有伎倆。