实体框架添加和删除实体?

时间:2014-03-13 17:04:45

标签: c# entity-framework entity-framework-4 linq-to-entities entity-framework-5

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

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方法会将实体置于Added状态,那么我认为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);
    }
}

2 个答案:

答案 0 :(得分:1)

我没有看到将实体的状态设置为“添加”的巨大好处,因为创建新实体并将其添加到集合中就像您提到的那样。这种类型的模式非常有用的地方是当你想要删除一个实体而不必首先从数据库中获取它时:

// 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,可以获得类似的效果,因此它将触发更新语句。有时你只是想要从数据库中获取项目的额外命中只是为了删除它。

答案 1 :(得分:0)

使用以下代码的ASP .NET ADD模式是非常标准的做法。

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;
}

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