我有一個類的方法來檢索數據從SQLite數據庫使用EF6。EF6加載指定的子實體每個查詢
的上下文是在構造函數被注入和那裏爲相同上下文被多次使用爲同一類的實例。我正在使用實體框架6的Include
擴展方法在查詢中包含子實體。要包含的項目在參數中指定,因此可以根據調用者的要求進行更改。
這裏是類的一個示例:
public class AccountManager
{
private SQLiteContext context;
// Injected Context
public AccountManager(SQLiteContext Context)
{
context = Context;
}
public Account GetAccountById(int AccountId, string ToInclude)
{
return context.Account
.Include(ToInclude)
.Single(a => a.AccountId == AccountId)
}
}
的問題是,如果我有一個孩子實體在我的第一個查詢(查詢),它工作正常,但如果我有一個不同孩子實體在後續查詢中(使用相同的上下文)查詢A的子實體也包括在內。例如:
AccountManager am = new AccountManager(MyContext);
// Run first query
var a1 = am.GetAccountById(1, "Payments");
// Run second query
// The result of this query also includes child entity "Payments"
// because it was added to the context in the previous query
var a2 = am.GetAccountById(1, "Owners");
有沒有我可以防止這種情況發生,並且每個查詢的「包含」設定唯一處理的方式?
使用相同的上下文時:僅通過從上下文中分離付款。或者用'AsNoTracking()'獲取數據。 –
這實際上是正確的答案(如果您將其更改爲答案,我會將其標記爲正確的答案) - 應每次爲每項「工作」實例化「AccountManager」類,以便上下文可以相應地進行跟蹤。這個類將最終放在WCF服務後面,這樣問題就會解決(每個請求都會創建一個新的上下文)。但目前它是MVVM(Light)項目的_DataService_部分,所以IOC將該類實例化一次,並被所有其他虛擬機重新使用。感謝您指點我正確的方向。 –