2009-08-01 153 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); 

工程进行了大量的这些问题。我希望能够通过这里找到更加优雅的解决方案。这似乎有伎俩。