C# 实体框架删除对象问题
我得到“无法删除对象,因为在ObjectStateManager中找不到它”。删除对象时 这里是代码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.
//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);