Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用与外部列表相同的对应字段更新实体列表_C#_Entity Framework - Fatal编程技术网

C# 使用与外部列表相同的对应字段更新实体列表

C# 使用与外部列表相同的对应字段更新实体列表,c#,entity-framework,C#,Entity Framework,我有一个名为Hazaa的实体,它包含两个字段:Killed(类型DateTime?)和Linky(类型Guid)。业务逻辑规定,每当我们创建一个新的Hazaa实例时,应该通过设置时间戳来终止旧的Hazaa实例 因此,对于单个元素,我应用如下方法 public void Create(Hazaa newbie) { using (ModelContainer context = new ModelContainer()) { Hazaa oldie = context.Hazaas

我有一个名为Hazaa的实体,它包含两个字段:Killed(类型DateTime?)和Linky(类型Guid)。业务逻辑规定,每当我们创建一个新的Hazaa实例时,应该通过设置时间戳来终止旧的Hazaa实例

因此,对于单个元素,我应用如下方法

public void Create(Hazaa newbie)
{
  using (ModelContainer context = new ModelContainer())
  {
    Hazaa oldie = context.Hazaas
      .Single(hazaa => hazaa.Linky == hazaa.Linky && !hazaa.Killed.HasValue);
    oldie.Killed = DateTime.Now;

    context.Hazaas.AddOrUpdate(oldie);
    context.Hazaas.Add(newbie);

    context.SaveChanges();
  }
}
现在,我想对批量更新使用类似的方法。该方法的签名如下

public void Create(List<Hazaa> newbies)
{
  ...
}
public void创建(列出新手)
{
...
}
我的问题是,考虑到新添加的列表,我不确定如何选择预先存在的HAZAA。一种方法是应用foreach语句并逐个执行它们(但这是一种缓慢的方法)。另一种方法是使用Contains方法(但这是一个问题,因为列表可能很长)

还有其他选择吗?我的同事建议如下。我觉得它可能会被重构,这样它就不会多次访问上下文。也许我会无缘无故地担心吗

public void Create(List<Hazaa> newbies)
{
  ...
  using (ModelContainer context = new ModelContainer())
  {
    List<Hazaa> oldies = newbies.Select(hazaa => context.Hazaas
      .Single(oldie => oldie.Linky == hazaa.Linky && !oldie.Killed.HasValue))
      .ToList();
    ...
  }
  ...
}
public void创建(列出新手)
{
...
使用(ModelContainer context=newmodelcontainer())
{
列出老手=新手。选择(hazaa=>context.Hazaas
.Single(oldie=>oldie.Linky==hazaa.Linky&&!oldie.Killed.HasValue))
.ToList();
...
}
...
}

由于您使用的是
Single
,因此我假设所有
Linky
都代表现有记录。这意味着您可以更新它们,而无需首先从数据库中获取它们:

using (ModelContainer context = new ModelContainer())
{
    foreach(var hazaa in newbies)
    {
        context.Attach(hazaa);
        hazaa.Killed = DateTime.Now; // Will mark hazaa as modified

        context.Add(new Hazaa { Linky = hazaa.Linky };
        context.Hazaas.Add(newbie);
    }
    context.SaveChanges();
}

由于您使用的是
Single
,因此我假设所有
Linky
s代表现有记录。这意味着您可以更新它们,而无需首先从数据库中获取它们:

using (ModelContainer context = new ModelContainer())
{
    foreach(var hazaa in newbies)
    {
        context.Attach(hazaa);
        hazaa.Killed = DateTime.Now; // Will mark hazaa as modified

        context.Add(new Hazaa { Linky = hazaa.Linky };
        context.Hazaas.Add(newbie);
    }
    context.SaveChanges();
}