2015-12-10 29 views
2

我有以下功能:如何在使用實體框架添加標識時從多個對象獲取標識?

public IEnumerable<Task> AddTasks(IEnumerable<Task> tasks) 
{ 
    foreach (Task task in tasks) 
    { 
     Db.Tasks.Add(task); 
    } 

    Db.SaveChanges(); 
    return tasks; 
} 

我需要這個函數中插入多個對象。返回任務然而,當,對象是一樣的,當我給那些的TaskID(身份)仍然具有0

值我想這一個的SaveChanges之後,但它墜毀:

//Revive object 
foreach (Task task in tasks) 
{ 
    Db.Entry(task).GetDatabaseValues(); 
} 

哪有我獲得這些項目的身份?

編輯:

public partial class Task 
    { 
     public int TaskID { get; set; } 
     public int ProjectID { get; set; } 
     public bool IsActive { get; set; } 
     public System.DateTime CreatedDate { get; set; } 
    } 

public void AddTasksUsingViewModels(IEnumerable<TaskVM> taskVms) 
{ 
    IEnumerable<Task> tasksToAdd = taskVms.Select 
    (
     t => 
     new Task 
     { 
      ProjectID = taskVm.ProjectID, 
      IsActive = true, 
      CreatedDate = DateTime.Now 
     } 
    ); 

    IEnumerable<Task> entityList = AddTasks(tasksToAdd); 
} 
+0

什麼類型的TaskID? int,GU​​ID? – skalinkin

+0

http://stackoverflow.com/questions/16079217/how-to-generate-and-auto-increment-id-with-entity-framework – skalinkin

+0

TaskID是一個i​​nt – Victor

回答

2

你是返回,你有作爲輸入您AddTasks相同IEnumerable<Task> tasks

當您多次遍歷同一個對象時,不保證獲得相同的一組對象。這在你的情況下尤其如此,因爲你傳遞給AddTasks方法的tasksToAdd對象是使用Select LINQ方法(taskVms.Select ...)創建的對象。 Select方法返回一個IEnuemrable,每次迭代它時都會生成這些項目。

你可能想要閱讀關於推遲執行IEnumerable<T>和LINQ。

爲了驗證這一點,並解決它,只需調用這樣的AddTasks方法之前轉換枚舉到一個列表:

IEnumerable<Task> entityList = AddTasks(tasksToAdd.ToList()); 

List<T>實現IEnumerable<T>。但是,確保List<T>在枚舉多次時會返回相同的一組對象(當然,假設沒有人從列表中添加或刪除項目)。

0

添加到您的任務類

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int TaskID { get; set; } 
相關問題