[英]Get the “indexOf” of an ICollection in Entity Framework
我有連接的方式,使得兩個對象ObjectA
中包含ICollection
的ObjectB
。 我希望能夠確定存儲在ObjectA
的ICollection<ObjectB>
內部的indexOf ObjectA
。
解決方案之一是將ICollection轉換為列表,然后使用內置的IndexOf。 但是,當多個線程訪問ICollection時,在許多情況下,我可以為多個ObjectB獲得相同的indexOf值。
問題有什么方法可以讓某個字段(類型為int)在ICollection中存儲ObjectB的索引? 如果不是,是否有辦法確保indexOf(當多個線程嘗試訪問它時)給出正確的索引(即與線程無關)?
我試圖確保為每個查找以及GetDatabaseValues()
和Reload()
使用新的上下文的可能解決方案 。 這種方法效果更好(尤其是在Debug模式下),但是當調試模式關閉時,相同的值索引將分配給更多的ObjectB
。
我試圖添加一個OrderBy語句,但似乎沒有一種方法有效。
// var objectB = new ObjectB();
using(var context = new ContextDb())
{
var objectA = context.ObjectAs.Single(x => x.Id == 1);
objectA.objectBs.Add(objectB);
context.SaveChanges();
context.Entry(objectB).Reload();
context.Entry(objectA).Reload();
var list = objectA.objectBs.Select(x => x.Id).OrderBy(x => x).ToList(); // order by primary key.
sb.AppendLine( string.Join(",", list.ToArray())); // for testing
objectB.LocalId= list.IndexOf(objectB.Id) + 1; // the "local id"
context.SaveChanges();
}
結果很奇怪,盡管我似乎能夠看到一個模式。 注意,上面的代碼在for循環中運行一定時間。 在第一次迭代期間(字符串生成器中的第一行)給出以下內容:
2932 2932,2933 2932,2933,2934 2932,2933,2934,2935,2936 2932,2933,2934,2935,2936,2937,2938 2932,2933,2934,2935,2936,2937,2938,2939,2940 2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942
第二行: 2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945 2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947
最后一行: 2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,2944,2945,2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961,2962,2963,2964,2965,2966,2967,2968,2969,2970
有人知道是否在Entity Framework中建立了構建方式來避免這些重復項?
老實說,我仍然不清楚您要尋找什么。 但是,根據您提出的問題,我可以說幾句話。 首先,當您從數據庫中提取任何內容時,沒有固有的順序。 默認情況下,如果可能的話,通常將按PK進行排序,或更合適的是按“插入順序”進行排序。 但是,如果需要准確的訂單,則要冒險。 如果您需要一個真正准確且可復制的訂單,則需要使用所需的ORDER BY
發出ORDER BY
子句。
特別是如果你依賴於通過任何渴望或延遲加載外鍵的實體框架填充導航屬性,你可以不依賴於內隱秩序可言 。 同樣,如果訂單很重要,則需要對實體上的某些屬性使用OrderBy
或OrderByDescending
,以確保獲得真正的“蘋果對蘋果”訂單比較。
使用IDictionary,您可以在其中存儲索引以及對象。 詞典
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.