添加带有Entity Framework的对象时如何从多个对象中获取身份?

How to get identity from multiple objects when adding those with Entity Framework?

我有以下功能:

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

   Db.SaveChanges();
   return tasks;
}

我需要在此函数中插入多个对象。但是,当返回任务时,对象与我发送时的对象相同,TaskID(身份)的值仍然为 0。

我在保存更改后尝试了这个,但它崩溃了:

//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);
}

将此添加到您的任务中 class

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

您 return 正在 IEnumerable<Task> tasks 与您 AddTasks 的输入相同 IEnumerable<Task> tasks

当您对同一个 IEnumerable<Task> 对象进行多次迭代时,不能保证获得相同的对象集。在您的情况下尤其如此,因为传递给 AddTasks 方法的 tasksToAdd 对象是使用 Select LINQ 方法 (taskVms.Select ...) 创建的对象。 Select 方法 return 是一个 IEnuemrable,它会在您每次迭代它时生成项目。

您可能想阅读有关 IEnumerable<T> 和 LINQ 的延迟执行。

要验证并修复它,只需在调用 AddTasks 方法之前将可枚举对象转换为列表,如下所示:

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

List<T> 实施 IEnumerable<T>。但是,当您多次枚举时,可以保证 List<T> 将 return 同一组对象(当然假设没有人从列表中添加或删除项目)。