是否IList <>保证C#中添加项的顺序
问题描述:
我使用Seed()
方法Configuration.cs
类用于在使用Update-Database命令时填充数据库中的数据。是否IList <>保证C#中添加项的顺序
除其他事项外,我创建EventCategory对象列表如下:
private IList<EventCategory> CreateEventCategoriesTestDefinition()
{
eventCategories = new List<EventCategory>();
var eventCategoryRecruitment = new EventCategory("Recruitment");
eventCategories.Add(eventCategoryRecruitment);
var eventCategoryInternship = new EventCategory("Internship");
eventCategories.Add(eventCategoryInternship);
var eventCategoryTrainingPrograms = new EventCategory("Training Programs");
eventCategoryTrainingPrograms.Events
.Add(new Event("Managerial Training Program 2012-2014", eventCategoryTrainingPrograms));
eventCategories.Add(eventCategoryTrainingPrograms);
var eventCategoryEmployee = new EventCategory("Employee & Team Potential");
eventCategories.Add(eventCategoryEmployee);
return eventCategories;
}
的元素添加元素。 eventCategory仅仅是一个私人财产:
private IList<EventCategory> eventCategories;
从Seed()
方法我打电话CreateEventCategoriesTestDefinition()
几乎一切都很好,但是当我去数据库查询数据我已经注意到,在EventCategory表中的数据没有正确的顺序:
正如你可以看到它的图片Internship
和Training Programs
切换比较于CreateEventCategoriesTestDefinition()
方法添加的顺序位置。
有没有人知道这里发生了什么?为什么添加顺序不被保留?我知道它应该保存在List<>
,但IList<>
不一样吗? 或者这可能与EntityFramework
有关?
答
如果您依赖数据库的排序顺序,然后要么。
-
打开自动识别增量关闭并指定自己的ID
EventCategory(INT ID,字符串名称)
-
如果你必须使用数据库身份则不用尝试使用排序顺序( INT)柱为对象
EventCategory(字符串名称,诠释中将sortOrder)
无论哪种方式,你都不能保证你会得到一个保存到数据库的排序列表。我不能确定你的用例在这里,但你不应该回答SQL来为你排序对象,但是当查询数据库时,使用linq在绑定到视图之前对它们进行排序。
例如
var mySortedCategories = dbContext.EventCategories.OrderBy(x => x.Name).ToList();
当保存更改时,EF不保证插入的顺序。它会根据它认为合适的对象图建立查询。至于'IList ',这只是一个接口:实现是维护或不维护的接口......接口不做任何事情 – Jcl
List (implementation)保证项目的顺序。我认为这个问题与EF有关。 –
列表保证排序,但数据库不是因为表格没有隐式顺序。你需要在你的SELECT语句中应用一个ORDER BY。如果您需要保留插入顺序,则必须将其存储为像“CreatedAt datetime”或“Position int”这样的列。然后将这些用于'ORDER BY'。 –