「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();
}}
attach オブジェクトを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
}
}
また、ObjectContext
sの使用をusing
ブロックでラップする必要があります。
メソッド「Form1_Load」で、「FirebirdEntity」コンテキストの最初のインスタンスを作成し、このコンテキストから選択されたエンティティでListViewItemを埋めます
メソッド「button3_Click」で、「FirebirdEntity」コンテキストの新しい2番目のインスタンスを作成します。次に、FIRSTコンテキストで選択されたこのSECONDコンテキストのエンティティを削除しようとします。
両方のメソッドでコンテキストの同じインスタンスを使用すると、すべてが正常に機能します。
(または、2番目のコンテキストから削除するエンティティを選択してから、元のエンティティの代わりにこのエンティティを削除することもできます)
DomainServiceメソッド内でlinqクエリを実行し、結果から削除したため、以下の最初のスニペットは「ObjectStateManagerに見つからなかったため、オブジェクトを削除できません」というエラーで失敗しましたが、2番目のスニペットは機能しました。
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);
}
通常、データベースでの削除には、この種の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();
お役に立てれば。
代理キーDepartmentUUIDを持つDepartmentというオブジェクトがあるとします。
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
次に、EntityFrameworkコードについて説明します。重要な部分は次のとおりです。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;
}
私が使用した嫌なほどひどいハックはこれです:
var attachedObject = _repository.GetObjectByKey(detachedObject.EntityKey);
これらの問題の多くで機能します。私はここに来ることによって、この問題に対するよりエレガントな解決策を見つけることを望んでいました。これでうまくいくようです。