【问题标题】:How to get identity from multiple objects when adding those with Entity Framework?使用实体框架添加对象时如何从多个对象中获取身份?
【发布时间】:2016-03-16 07:55:47
【问题描述】:

我有以下功能:

public IEnumerable<Task> AddTasks(IEnumerable<Task> tasks)
{
   foreach (Task task in tasks)
   {
      Db.Tasks.Add(task);
   }

   Db.SaveChanges();
   return tasks;
}

我需要在这个函数中插入多个对象。但是当返回任务时,对象与我发送时相同,TaskID(身份)的值仍然为0。

我在 savechanges 之后尝试了这个,但它崩溃了:

//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);
}

【问题讨论】:

  • 你的TaskID是什么类型的?整数,GUID?
  • 请出示您的任务类声明。
  • 在调用 SaveChanges 后尝试使用 StoreWins 值调用 RefreshMode 方法
  • 你的Task的映射逻辑是什么,如果它是一个身份字段,我假设它是自动递增的。不确定您使用的是哪个版本的 EF,但根据我以前的经验,您不需要在某个地方将 EntityState 设置为 Add 吗?否则,它们将被视为相同。有不同的框架可以自动完成,但也许新的 EF 不必再这样做了……

标签: c# entity-framework linq identity


【解决方案1】:

将此添加到您的任务类

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int TaskID { get; set; }

【讨论】:

    【解决方案2】:

    您返回的IEnumerable&lt;Task&gt; tasks 与您作为AddTasks 的输入相同。

    当您多次迭代同一个IEnumerable&lt;Task&gt; 对象时,您无法保证获得相同的对象集。在您的情况下尤其如此,因为您传递给AddTasks 方法的tasksToAdd 对象是使用Select LINQ 方法(taskVms.Select ...) 创建的对象。 Select 方法返回一个 IEnuemrable,每次迭代它时都会生成项目。

    您可能想了解使用 IEnumerable&lt;T&gt; 和 LINQ 的延迟执行。

    要验证并修复它,只需在调用 AddTasks 方法之前将可枚举转换为列表,如下所示:

    IEnumerable<Task> entityList = AddTasks(tasksToAdd.ToList());
    

    List&lt;T&gt; 实现IEnumerable&lt;T&gt;。但是,可以保证List&lt;T&gt; 在您多次枚举时返回相同的对象集(当然假设没有人从列表中添加或删除项目)。

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多