是否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表中的数据没有正确的顺序:

enter image description here

正如你可以看到它的图片InternshipTraining Programs切换比较于CreateEventCategoriesTestDefinition()方法添加的顺序位置。

有没有人知道这里发生了什么?为什么添加顺序不被保留?我知道它应该保存在List<>,但IList<>不一样吗? 或者这可能与EntityFramework有关?

+5

当保存更改时,EF不保证插入的顺序。它会根据它认为合适的对象图建立查询。至于'IList ',这只是一个接口:实现是维护或不维护的接口......接口不做任何事情 – Jcl

+2

List (implementation)保证项目的顺序。我认为这个问题与EF有关。 –

+2

列表保证排序,但数据库不是因为表格没有隐式顺序。你需要在你的SELECT语句中应用一个ORDER BY。如果您需要保留插入顺序,则必须将其存储为像“CreatedAt datetime”或“Position int”这样的列。然后将这些用于'ORDER BY'。 –

如果您依赖数据库的排序顺序,然后要么。

  1. 打开自动识别增量关闭并指定自己的ID

    EventCategory(INT ID,字符串名称)

  2. 如果你必须使用数据库身份则不用尝试使用排序顺序( INT)柱为对象

    EventCategory(字符串名称,诠释中将sortOrder)

无论哪种方式,你都不能保证你会得到一个保存到数据库的排序列表。我不能确定你的用例在这里,但你不应该回答SQL来为你排序对象,但是当查询数据库时,使用linq在绑定到视图之前对它们进行排序。

例如

var mySortedCategories = dbContext.EventCategories.OrderBy(x => x.Name).ToList();