我有两个对象,它们以这样的方式连接起来,即ObjectA包含一个ICollection of ObjectB。我希望能够在存储在indexOf中的ICollection<ObjectB>中确定ICollection<ObjectB>中的ObjectA。
解决方案之一是将ICollection转换为列表,然后使用内置的IndexOf。但是,当多个线程访问ICollection时,在许多情况下,我可以为多个ObjectB获得相同的indexOf值。
问题有没有办法在ICollection中有一个存储ObjectB索引的字段(int类型)?如果没有,是否可以确保indexOf (当多个线程试图访问它时)给出正确的索引(即,不管线程如何)?
可能的解决方案--,我试图确保为每次查找以及GetDatabaseValues()和Reload()使用一个新的上下文。这更好用(特别是在调试模式下),但是当关闭调试模式时,会给更多的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,是否有人知道实体框架中是否存在构建以避免这些重复?
发布于 2015-08-04 16:53:09
老实说,我还是不太清楚你在找什么。不过,根据你提出的问题,我可以说几句话。首先,当您从数据库中提取任何内容时,没有固有的顺序。默认情况下,它通常由PK来排序,如果可能的话,或者用“插入顺序”更合适。然而,如果需要精确的订单,那么依赖它是有风险的。如果您需要一个真正准确和可复制的订单,那么您需要按照您想要的顺序发出一个ORDER BY子句。
特别是如果您依赖实体框架通过急切或延迟加载外键填充的导航属性,则根本无法依赖内嵌顺序。同样,如果订单很重要,那么您需要在实体上使用带有一些属性的OrderBy或OrderByDescending,以确保得到真正的苹果到苹果订单比较。
发布于 2015-08-04 16:08:03
使用IDictionary,可以在其中存储索引以及对象。IDictionary
https://stackoverflow.com/questions/31814067
复制相似问题