实体框架添加和删除实体

本文关键字:实体 删除 添加 框架 | 更新日期: 2023-09-27 17:50:00

我看到两个代码用于添加和删除实体,我想知道哪一个是最好的方式,这两者之间的区别是什么。一个是(用于添加):

using (var context = new BloggingContext()) 
{ 
    var blog = new Blog { Name = "ADO.NET Blog" }; 
    context.Blogs.Add(blog); 
    context.SaveChanges(); 
}

,另一个是:

using (var context = new BloggingContext()) 
{ 
    var blog = new Blog { Name = "ADO.NET Blog" }; 
    context.Entry(blog).State = EntityState.Added; 
    context.SaveChanges(); 
}

,我读到调用DbSet上的Add方法将实体置于已添加状态。

据此,我认为以上两个代码几乎是相同的。如果不是,请告诉我有什么不同。

我找到的另一个代码是:

public virtual void Add(T entity)
{
    DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
    if (dbEntityEntry.State != EntityState.Added)
    {
        dbEntityEntry.State = EntityState.Added;
    }
    else
    {
        DbSet.Add(entity);
    }
}

如果在DbSet上调用Add方法将实体置于已添加状态,那么我认为if和else块中的代码没有区别,那么这里的重点是什么呢?

并从以上三个代码中找出添加实体的最佳方式。

另一个让我怀疑的代码是下面代码中的else块的用途:

public virtual void Delete(T entity)
{
    DbEntityEntry dbEntityEntry = DbContext.Entry(entity);
    if (dbEntityEntry.State != EntityState.Deleted)
    {
        dbEntityEntry.State = EntityState.Deleted;
    }
    else
    {
        DbSet.Attach(entity);
        DbSet.Remove(entity);
    }
}

实体框架添加和删除实体

我不认为将实体的状态设置为已添加有什么巨大的好处,因为创建一个新实体并将其添加到集合中就像您提到的那样。当你想要删除一个实体而不需要先从数据库中获取它时,这种模式非常有用:

// this entity will be unattached at this point, so if you were to call remove
// on the dbset it wouldn't do much, since it doesn't think it's in the database
var deleteThisEntity = new Blog { Id = 5 };
// if you set the state to deleted, it now thinks that it needs to be deleted
db.Entry(deleteThisEntity).State = EntityState.Deleted;
// call SaveChanges to delete
db.SaveChanges();

您可以通过将状态设置为modified来获得类似的效果,因此它将触发更新语句。有时候,您只是不想从数据库中获取一个项来删除它。

使用下面的代码为asp.net添加模式是非常标准的做法。

using (var context = new BloggingContext()) 
{ 
    var blog = new Blog { Name = "ADO.NET Blog" }; 
    context.Blogs.Add(blog); 
    context.SaveChanges(); 
}

在delete代码中,if/else语句用于检查获取的对象是否有效。

我一直在使用DELETE模式的代码是这样的:

var fetchedObject = context.Blog.Find(id);
if (fetchedObject == null)
{
    return false;
}
else
{
    ds.Blog.Remove(fetchedObject);
    return true;
}

这是Manager类中接收id的方法。