添加带有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 同一组对象(当然假设没有人从列表中添加或删除项目)。
我有以下功能:
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 同一组对象(当然假设没有人从列表中添加或删除项目)。