如何在使用实体框架添加多个对象时从这些对象获取标识
本文关键字:对象 标识 获取 实体 添加 框架 | 更新日期: 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> tasks
与AddTasks
的输入相同。
当您对同一个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; }