2016-11-25 81 views
0

我使用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'。 –

回答

0

如果您依賴數據庫的排序順序,然後要麼。

  1. 打開自動識別增量關閉並指定自己的ID

    EventCategory(INT ID,字符串名稱)

  2. 如果你必須使用數據庫身份則不用嘗試使用排序順序( INT)柱爲對象

    EventCategory(字符串名稱,詮釋中將sortOrder)

無論哪種方式,你都不能保證你會得到一個保存到數據庫的排序列表。我不能確定你的用例在這裏,但你不應該回答SQL來爲你排序對象,但是當查詢數據庫時,使用linq在綁定到視圖之前對它們進行排序。

例如

var mySortedCategories = dbContext.EventCategories.OrderBy(x => x.Name).ToList(); 
相關問題