如何在使用实体框架添加多个对象时从这些对象获取标识

本文关键字:对象 标识 获取 实体 添加 框架 | 更新日期: 2023-09-27 18:26:18

我有以下功能:

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

如何在使用实体框架添加多个对象时从这些对象获取标识

返回的IEnumerable<Task> tasksAddTasks的输入相同。

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

您可能想了解IEnumerable<T>和LINQ的延迟执行。

要验证并修复此问题,只需在调用AddTasks方法之前将enumerable转换为列表,如下所示:

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

List<T>实现IEnumerable<T>。但是,当您多次枚举List<T>时,可以保证它将返回相同的对象集(当然,假设没有人添加或删除列表中的项)。

将其添加到任务类中

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