c# - 使用 Entity Framework 添加多个对象时如何获取多个对象的标识?

标签 c# entity-framework linq identity

我有以下功能:

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/

相关文章:

c# - SQL 创建触发器命令通过 MySQL Workbench 运行良好,但通过 Entity Framework 调用时出错

c# - 复合键 Entity Framework 7“属性无法添加到实体类型

c# - 比较 C# 中的两个字典

c# - UWP 中有小时、分钟和秒的时间控制吗?

asp.net-mvc - 数据 Entity Framework 中的显示名称

c# - Windows 8 C# 同时读取和写入文件

c# - 当 .Count() 大于零时从 .Select() 获取 NullReferenceException LINQ to XML

c# - 有没有办法简化Linq新对象初始化的初始化?

c# - WPF 中作用域 EF Core DbContext 的生命周期

c# - 调用jquery函数时如何将值作为参数传递