新聞中心
Entity Framework (EF) 是一個用于 .NET 開發(fā)的 ORM 框架,其更大的優(yōu)勢之一是具有極其靈活的查詢和數(shù)據(jù)操作能力。但是,有時候我們需要強制從數(shù)據(jù)庫中獲取一個數(shù)據(jù)而不使用緩存。這在 EF 中應(yīng)該如何實現(xiàn)呢?

網(wǎng)站的建設(shè)成都創(chuàng)新互聯(lián)公司專注網(wǎng)站定制,經(jīng)驗豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計體驗!已為成都石雕等企業(yè)提供專業(yè)服務(wù)。
現(xiàn)在,我們假設(shè)有一個簡單的示例,其中包含兩個實體類:Customer 和 Order。Customer 包含一個訂單 OrderList:
“`csharp
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection OrderList { get; set; }
}
public class Order
{
public int Id { get; set; }
public DateTime OrderDate { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
}
“`
在這個示例中,我們有一個指向 Customer 實體的導航屬性,稱為 OrderList。
如果我們以以下方式獲取 OrderList,即通過 Customer 實例調(diào)用這個屬性:
“`csharp
var customer = dbContext.Customers.FirstOrDefault(c => c.Id == 1);
var orders = customer.OrderList;
“`
EF 默認會從數(shù)據(jù)庫中加載 Customer,并在之一次訪問其 OrderList 屬性時對其進行延遲加載。
但是,該緩存可能會導致問題。例如,在一個線程中修改了一個訂單,而在另一個線程中卻查看了相同客戶的訂單列表,此時你可能會看到舊數(shù)據(jù)而不是更新后的內(nèi)容。為了避免此類問題,可以通過以下方式強制從數(shù)據(jù)庫中獲取數(shù)據(jù):
“`csharp
var customer = dbContext.Customers
.Include(c => c.OrderList)
.AsNoTracking()
.FirstOrDefault(c => c.Id == 1);
var orders = customer.OrderList.ToList();
“`
此處使用的 AsNoTracking() 方法告訴 EF 不要跟蹤這個對象。而 Include() 方法指示 EF 裝載 OrderList 屬性的數(shù)據(jù)。通過調(diào)用 ToList(),我們可以確保此時 EF 將從數(shù)據(jù)庫中獲取 OrderList 而不是從緩存中獲取它。
如果想要避免出現(xiàn) bug,或者出于其他安全或性能考慮,我們強烈建議您在類似上述代碼的 EF 查詢中使用該方法。
相關(guān)問題拓展閱讀:
- jsp中下拉框中的值從數(shù)據(jù)庫中動態(tài)獲取
- ef查詢是在內(nèi)存中過濾還是從數(shù)據(jù)庫過濾
jsp中下拉框中的值從數(shù)據(jù)庫中動態(tài)獲取
我的采用的漏賀是javabena+jsp
一個javabean
public ArrayList selectCourseInfo()throws Exception {//下拉框顯察神示課程信息
ArrayList list = new ArrayList();
try {
db.open();
ResultSet rs = db.select(“select * from CourseInfo”);
while (rs.next()) {
list.add(new CourseInfo(rs.getInt(1), rs.getString(2),rs.getString(3)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
db.close();
}
return list;
}
然后在jsp中調(diào)用
課 程:
這樣就可以動態(tài)的顯示了
jsp中把數(shù)據(jù)庫全量查詢后填充select列表:
舉例說明:
入學批次: //選擇入學批次會刷新層次和專業(yè)
請選擇–
${gradeInfo.gradeName}
統(tǒng)考課程:
請選擇侍喚氏–
${uniExamCourse.uniExamCourseName}
//設(shè)置ID,用于填充層次鏈中和專業(yè)的下拉框
層次: //選擇層次后刷新專業(yè)
請選擇–
${educationLevel.educationLevelName}
專業(yè):
請選擇–
老散${special.specialName}
java后臺通過dao接口獲取specialList的值,并且保存到session即可。
jsp中把數(shù)據(jù)庫全量查詢后填充select列表:
舉例說明:
入學批次:
//選擇入學批次會刷新層次和專業(yè)
–請選擇–
${gradeInfo.gradeName}
統(tǒng)考課程:
–請選擇–
${uniExamCourse.uniExamCourseName}
//設(shè)置ID,用于填充層次和專業(yè)的下拉框
層
次:
//選擇層次后刷新專業(yè)
–請選擇–
${educationLevel.educationLevelName}
專
業(yè):
–請選擇–
${special.specialName}
java后臺通過dao接口獲取specialList的值,并且保存到session即可。
用struts,
或者ajax,
再或者你用js吧。
普通的循環(huán)應(yīng)該也可以。
但你的要求我感覺滾絕struts標簽是更好的.
========================================
你或胡的數(shù)據(jù)是一個javabean的list(大團姿)嗎?
我的采用的是javabena+jsp
一個javabean
public
ArrayList
selectCourseInfo()throws
Exception
{//下拉框顯示課程信息
ArrayList
list
=
new
ArrayList();
try
{
db.open();
ResultSet
rs
=
db.select(“select
*
from
CourseInfo”);
while
(rs.next())
{
list.add(new
CourseInfo(rs.getInt(1),
rs.getString(2),rs.getString(3)));
}
}
catch
(Exception
e)
{
e.printStackTrace();
}
finally
{
db.close();
}
return
list;
}
然后在jsp中調(diào)用
課
程:
這樣就可以動態(tài)的顯示了
ef查詢是在內(nèi)存中過濾還是從數(shù)據(jù)庫過濾
看你的意思是大量的、基礎(chǔ)的數(shù)據(jù),那應(yīng)該是經(jīng)常用到的,且變盯擾化不大的數(shù)據(jù)。這些數(shù)據(jù)還是放在內(nèi)存中比較好,訪問起來快而且拍爛不需要經(jīng)常連數(shù)據(jù)庫襲則漏。
關(guān)于ef 強制從數(shù)據(jù)庫獲取的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機房服務(wù)器托管/機柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機房租用、服務(wù)器托管、機柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動、聯(lián)通機房等。
分享名稱:EFORM技巧:強制從數(shù)據(jù)庫獲取數(shù)據(jù)(ef強制從數(shù)據(jù)庫獲取)
轉(zhuǎn)載注明:http://m.fisionsoft.com.cn/article/cdgeocj.html


咨詢
建站咨詢
