【问题标题】:Simplest Way to Delete Object with Entity Framework 4使用 Entity Framework 4 删除对象的最简单方法
【发布时间】:2014-05-21 22:05:53
【问题描述】:

确认!我是 Entity Framework 的新手,正在尝试找到删除项目的最简单方法。

我有一个列表框,其中数据源设置为数据库中的 TagCategory 对象。这工作正常。现在我想删除选定的项目。所以我做了这样的事情:

TagCategory category = (TagCategory)lstCategories.SelectedItem;
using (MyEntities context = new MyEntities())
{
    context.AttachTo("TagCategories", category);
    context.DeleteObject(category);
    context.SaveChanges();
}

这看起来很简单,但它不起作用。什么都没有被删除,没有错误信息,什么都没有。

所以我发现我可以这样做:

using (MyEntities context = new MyEntities())
{
    string cmd = String.Format("DELETE FROM TagCategory WHERE TagCatID=@ID",
        category.TagCatID));
    context.ExecuteStoreCommand(qry);
}

这似乎行得通。那么我应该选择可行的方法,还是 Entity Framework 4 真的能够做到这一点?

编辑:没关系。事实上,我遇到了另一个阻止代码表单执行的问题。我发布的两个 sn-ps 似乎都可以正常工作。我很抱歉。

【问题讨论】:

  • 顺便说一句,尽量不要在上下文中使用AttachTo。使用ObjectSet<T>.Attach。例如context.TagCategories.Attach(category)。同样context.Categories.Delete(category) 而不是context.DeleteObject(category)
  • @RPM1984:我想知道这两种语法是否做同样的事情。你能说一下为什么实体上的 Attach() 更好吗?
  • 这不是很明显吗?一个是强类型,一个是魔术字符串。如果你重构你的模型,你会得到运行时错误。使用Attach 你会得到一个编译错误。每当您在应用程序中anywhere 放置一个魔术字符串时,问问自己为什么,看看是否可以避免。
  • @RPM1984:好的,所以它们的工作方式相同,但一个是强类型的。我明白这一点,但每当有人说不要做某事时,我总是会问。谢谢。
  • 现在是“删除”而不是“删除”,顺便说一句。

标签: .net winforms entity-framework-4


【解决方案1】:

您可以使用存根实体,如下所示:

using (var context = new MyEntities())
{
     var tagCategory = new TagCategory
     {
         PostId = category.TagCatID
     };
     context.TagCategories.Attach(tagCategory);
     context.DeleteObject(tagCategory);
     context.SaveChanges();
}

【讨论】:

  • 为什么会有帮助?在我的代码中,类别已经是 TagCategory 并且已经设置了 ID。我错过了什么吗?
  • 尝试附加它,看看它是否有效,否则只需创建一个存根实体,仅分配 ID 并附加到上下文,然后您可以执行删除,这里有一个很好的描述:@987654321 @
  • 是的,我认为这与我之前的尝试没有什么不同。我尝试了您的代码(将 PostId 更改为 TagCatID),但得到了相同的结果。
  • 如果您在后端使用 SQL,请尝试运行 SQL Server Profiler 并捕获对您的数据库执行的跟踪,至少您会发现它是否能做到那么远以及是什么原始 SQL
【解决方案2】:

我不确定您是否可以为此使用 AttachTo()。取决于您如何填充 ListBox。

什么应该起作用:

  var Key = context.CreateEntityKey("TagCategory", category);
  Object original;
  if (context.TryGetObjectByKey(Key, out original))
  {
        context.DeleteObject(original);
        context.SaveChanges();
  }

【讨论】:

  • 我已经使用 AttachTo() 成功更改了对象的值,然后保存它们。我试过上面的代码。还是什么都没有。
【解决方案3】:
// using the Find method of DBContext to retrieve the record you wish to delete
// works for me
// below code taken from a working WPF application using sdf database 

if (this.TransactionsDataGrid.SelectedIndex > -1)
{
    Transaction transaction = this.TransactionsDataGrid.SelectedItem as Transaction;
    if (transaction != null)
    {
        using (BilliEntities context = new BilliEntities())
        {
           try
           {
               Transaction trans = context.Transactions.Find(transaction.TransactionId);
               if (trans != null)
               {
                   // observable collection for datagrid
                   this.Transactions.Remove(transaction);
                   context.Transactions.Remove(trans);
                   context.SaveChanges();
               }
           }
           catch (Exception ex)
           {
              // for debugging
           }
        }
     }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多