2015-11-09 167 views
-1

我不知道什麼是在這種情況下的最佳實踐:實體框架+「使用」模式的最佳實踐

我有方法,它調用在using語句(一次性數據庫上下文)的一些其他方法,以及其他方法還需要訪問數據庫上下文,所以這是選項1:

using (var db = new Database()) 
{ 
     // some code here 

     //calling other function 
     var cnt = SomeFunction(); 
} 

int SomeFunction() 
{ 
    using (var db = new Database()) 
    { 
     // some code here for example: 
     return db.Users.Count(); 

    } 
} 

這裏是選項2:

using (var db = new Database()) 
{ 
    // some code here 

    //calling other function 
    var cnt = SomeFunction(db); 
} 

int SomeFunction(Database db) 
{ 
    return db.Users.Count(); 
} 

注:Database看起來不便。像這樣:

public class Database : IdentityDbContext<User> 
{ 
    public Database() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
     Configuration.LazyLoadingEnabled = true; 
    } 


    public DbSet<IdentityUser> AspNetUsers { get; set; } 
} 

我會去與選項2,因爲沒有必要對數據庫上下文的初始化了,但我不知道這是否是這樣做的正確方法。

+0

我也會選擇'2',但出於更好的理由:您可以使'SomeFunction'使用接口而不是'Database'具體類型。 –

回答

2

DbContext實例擁有自己的更改跟蹤器。如果你想使用變更DbSet裏面SomeFunction,使用相同的DbContext。如果沒有,你可以選擇你喜歡的任何東西。

1

我會選擇3:超載您的SomeFunction

int SomeFunction() 
{ 
    using (var db = new Database()) 
    return SomeFunction(db); 
} 

int SomeFunction(Database db) 
{ 
    return db.Users.Count(); 
} 

讓來電者決定是否通過現有的Database。有時它是有道理的,如果調用者已經有一個,如你的例子。其他時候,調用者只需要執行一個數據庫操作,然後通過不打擾調用者負責創建Database並記住正確處理它來簡化API有一些好處。