gpt4 book ai didi

c# - 使用 Entity Framework 添加对象时如何从多个对象中获取身份?

转载 作者:行者123 更新时间:2023-11-30 23:32:40 26 4
gpt4 key购买 nike

我有以下功能:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com