2

我看到两个添加和删除实体的代码,我不知道哪个是最好的方法,这两者有什么区别。 一个是这个(添加):实体框架添加和删除实体?

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方法把实体纳入增加的状态,那么我认为这是在代码中没有区别的,如果和别的块,所以这里有什么意义。

并从上面三个代码中增加实体的最佳方式。

而且在我所怀疑的另一个代码是什么,是在下面的代码使用其他块:使用代码波纹管的ASP .NET

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); 
    } 
} 
+0

好问题,我怀疑直接修改州属性不会被认为是最好的做法,但他们可能会做同样的事情。由于我不确定,我会让其他人回答:) – BradleyDotNET

回答

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(); 

您可以通过状态设置为修改得到类似的效果,所以它会触发更新声明。有时你只是不想从数据库中取出一个项目的额外命中只是为了删除它。

+0

表示在调用DbSet上的Add方法并将实体状态属性更改为Added时没有更改。 请问你还可以在Add(T)函数中解释else块的作用是什么,并且在Delete(T)中else块的作用是什么? –

+0

我不认为其他部分是有用的。如果状态被删除,则附加它(它已经连接)或调用Remove(删除状态)都没有意义。 – Dismissile

0

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的管理类中的方法。

+0

你根本没有回答他的问题。 – Dismissile