使用LINQ删除项目

时间:2019-01-25 20:07:07

标签: c# asp.net linq

我用来从数据库中删除项目的方法抛出了错误 “无法删除该对象,因为在ObjectStateManager中找不到该对象。”

我在网上遵循了多个建议以尝试附加它,但是它又抛出了另一个错误 “附加类型为'databaseName'的实体失败,因为相同类型的另一个实体已经具有相同的主键值。在使用'附加'方法或将实体的状态设置为'未更改'或'已修改'时,可能会发生这种情况。如果图中的任何实体具有相互冲突的键值,这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用“添加”方法或“已添加”实体状态来跟踪该图然后根据需要将非新实体的状态设置为“未更改”或“已修改”。”

        public bool deleteItem(Item s)
        {
            bool success = false;
            using (DBEntities cxt = new DBEntities())
            {

                    var saving = (from i in cxt.Items
                                  where i.Id == s.Id
                                  select i).FirstOrDefault();

                cxt.Entry(s).State = System.Data.Entity.EntityState.Deleted;

                //cxt.Items.Attach(s);
                cxt.Items.Remove(s);              

                int delete = cxt.SaveChanges();
                if (delete == 1)
                {
                    success = true;
                }
                return success;
            }
        }

1 个答案:

答案 0 :(得分:1)

您可以使用一个数据库调用而不是2来执行此操作。附加实体,然后在DbSet上调用Remove将其删除。

public bool deleteItem(Item s)
{
    bool success = false;
    using (DBEntities cxt = new DecagonDBEntities())
    {
        cxt.Items.Attach(s);
        cxt.Items.Remove(s);              

        int delete = cxt.SaveChanges();
        bool success = delete == 1;
        return success;
    }
}

如果您仍然想检索它进行验证

public bool deleteItem(Item s)
{
    bool success = false;
    using (DBEntities cxt = new DecagonDBEntities())
    {
        var itemToDelete = cxt.Items.SingleOrDefault(_ => _.Id == s.Id);
        // validate itemToDelete like check for null etc
        cxt.Items.Remove(itemToDelete);

        int delete = cxt.SaveChanges();
        bool success = delete == 1;
        return success;
    }
}