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