我有以下功能:
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>
时对象多次,不能保证您获得同一组对象。对于您的情况尤其如此,因为 tasksToAdd
您传递给 AddTasks
的对象方法是使用 Select
创建的方法LINQ 方法 (taskVms.Select ...
)。 Select
方法返回 IEnuemrable
每次迭代时都会生成项目。
您可能想阅读有关延迟执行 IEnumerable<T>
的内容和 LINQ。
要验证此问题并修复它,只需在调用 AddTasks
之前将可枚举类型转换为列表即可。方法如下:
IEnumerable<Task> entityList = AddTasks(tasksToAdd.ToList());
List<T>
实现IEnumerable<T>
。但是,可以保证 List<T>
当您多次枚举时,将返回同一组对象(当然假设没有人从列表中添加或删除项目)。
关于c# - 使用 Entity Framework 添加多个对象时如何获取多个对象的标识?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34205988/