C# 实体框架删除对象问题

C# 实体框架删除对象问题,c#,entity-framework,ado.net,C#,Entity Framework,Ado.net,我得到“无法删除对象,因为在ObjectStateManager中找不到它”。删除对象时 这里是代码 //first i am filling listview control. private void Form1_Load(object sender, EventArgs e) { FirebirdEntity asa = new FirebirdEntity(); ObjectQuery<NEW_TABLE> sorgu = asa.

我得到“无法删除对象,因为在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();


            }}
//首先我要填充listview控件。
私有void Form1\u加载(对象发送方、事件参数e)
{
FirebirdEntity asa=新FirebirdEntity();
ObjectQuery sorgu=asa.NEW_表;
foreach(sorgu中的var项目)
{
ListViewItem list=新建ListViewItem();
list.Text=item.AD;
列表.子项.添加(项.SOYAD);
list.Tag=项目;
listView1.Items.Add(列表);
}
//而不是从listview的标记属性获取新的_表实体。
私有无效按钮3\u单击(对象发送者,事件参数e)
{
使用(FirebirdEntity arama=new FirebirdEntity())
{
新建表格del=(新建表格)列表视图1。选择编辑项[0]。标记;
arama.DeleteObject(del);
arama.SaveChanges();
}}
您需要将对象添加到
ObjectContext
中。请尝试:

NEW_TABLE del = (NEW_TABLE)listView1.SelectedItems[0].Tag;
arama.Attach(del);
arama.DeleteObject(del);
arama.SaveChanges();
附加对象由
ObjectContext
跟踪。这是执行删除和更新所必需的。您可以在MSDN上阅读更多信息

编辑以澄清附着/分离:

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
    }
}
private void Form1\u加载(对象发送方,事件参数e){
FirebirdEntity asa=新FirebirdEntity();
ObjectQuery sorgu=asa.NEW_表;
foreach(sorgu中的var项目){
asa.分离(项目);
//添加到listView1
}
}
此外,您应该将
ObjectContext
s的使用包装在
using
块中。

在方法“Form1\u Load”中,您创建了“FirebirdEntity”上下文的第一个实例,并用从此上下文中选择的实体填充ListViewItem

在“button3\u Click”方法中,创建“FireBirIdentity”上下文的第二个新实例。然后尝试删除在第一个上下文中选择的第二个上下文中的实体

在两种方法中使用相同的上下文实例,一切都会正常工作


(或者,您可以选择要从第二个上下文中删除的实体,然后删除此实体,而不是原始实体)

通常对于数据库中的删除,我使用这种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();

希望这能有所帮助。

我在我的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);
}

假设我有一个名为Department的对象,带有一个代理Ekey 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.创建临时对象,并设置其主键值(代理键)


我使用的骇人听闻的黑客是:

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

适用于许多此类问题。我希望通过来到这里找到解决此问题的更优雅的解决方案。这似乎可以解决问题。

我现在遇到此错误;一个实体对象不能被多个IEntityChangeTracker实例引用。您需要将其与提供实体的ObjectContext分离。调用ObjectContext、 将对象作为参数进行分离。现在我遇到了错误,如“对象无法分离,因为它未被分离”。:(只有一个Objectcontext,我正在尝试附加deattach.。有什么解决方案吗?抱歉,我不清楚。在将实体附加到另一个实例以进行删除之前,您需要将实体从提供给您实体的Objectcontext实例中分离出来。我将编辑我的帖子以进行澄清。最后4行应该是:返回上下文.SaveChanges();。还要删除returnValue变量。为什么在代码中产生这么多无用的噪音?有些框架返回已删除的对象。()如果方法有效,有些框架会返回bool。有些框架会返回受影响的行数。有些框架会返回void。不这样做并不意味着不需要它。但是,是的,我的代码可以通过使用“returnValue=context.SaveChanges();”来精简。(是的,可读性。这段代码尽可能丑陋。而且不可读。这就是我的意思。是的。你是100%正确的。这是互联网上最丑陋的代码。它不可读。没有人能理解我在代码中试图做什么。完全100%不可读。你是100%对的。你永远是100%对的。我向你的朋友鞠躬“正确”。谢谢你花时间纠正我。我很荣幸听到你的评论,你甚至会想起我。有趣的是,我曾经和一个来自波兰的30多岁的名叫卢卡斯的家伙一起工作。他非常友善,令人鼓舞。()
var attachedObject = _repository.GetObjectByKey(detachedObject.EntityKey);