2011-05-21 24 views
0

我已经将我的数据网格绑定到列表。我正在关注Repository模式并使用EF v4.1。我需要删除row_deleting事件上的实体。这是代码:grdview_RowDeleting DataItem为空

protected void grdBooks_RowDeleting(object sender, System.Web.UI.WebControls.GridViewDeleteEventArgs e) 
    { 
     int bookId = (int)e.Keys[0]; 
     //grdBooks.Rows[e.RowIndex] //this item's dataItem is always null. 
    } 

由于我正在使用实体,我需要实际的实体将它传递给我的GenericRepository,它将删除该实体。我确实得到了bookId,但我不想做一些愚蠢的事情,比如使用这个bookId从数据库中获取实体,然后把它传递给我的删除方法。为什么DataItem总是空,我能做些什么来取回我的实体?

感谢提前:)

回答

1

你不需要任何提取,删除它。只需使用指定的ID创建实体,附加它然后调用Remove。

Person user = new Person() { PersonId = Id }; 
db.Persons.Attach(person); 
db.Persons.Remove(person); 
db.SaveChanges(); 
+0

我得到了异常如果我按照你的建议去做。 EntityKey为空,因此不能附加对象。 – TCM 2011-05-21 14:37:56

+0

请参阅http://stackoverflow.com/questions/1007737/is-there-a-way-to-delete-an-entity-by-its-entitykey-witout-loading-it – 2011-05-21 15:24:30

0

我不是我发售者是否明白你的问题的正确与否,但我认为你应该试试这个

grdBooks.Rows[e.RowIndex].Cells[index].Text; 
+0

@Thomas: - 我想要得到的实体从删除按钮被按下的行开始。你明白了吗?请让我知道你是否仍然没有得到它。我将以更好的方式详细解释我的问题。 – TCM 2011-05-21 14:38:58

2

的DataItem = null,因为当你的数据绑定数据,在Page_Load中只有一次的GridView

public void Page_Load() 
{ 
    if (!Page.IsPostBack) 
    { 
     grid.DataSource = GetDataSource(); 
     grid.DataBind(); 
    } 
} 

数据存储在视图状态。单击删除后,您可以回发到服务器。数据仍然存在于Gridview的viewstate中,而不是反弹。

如果您有ID,则可以删除该对象。你可以做到这一点在三种不同的方式

  1. http://blogs.msdn.com/b/alexj/archive/2009/03/27/tip-9-deleting-an-object-without-retrieving-it.aspx

  2. 呼叫context.ExecuteStoreCommand和只是普通DELETE FROM -http://msdn.microsoft.com/en-us/library/ee358769的.aspx(第2例)

  3. 在数据库中创建存储过程,将其导入模型,并使用调用它context.ExecuteFunction()

相关问题