C# 使用与外部列表相同的对应字段更新实体列表
我有一个名为Hazaa的实体,它包含两个字段:Killed(类型DateTime?)和Linky(类型Guid)。业务逻辑规定,每当我们创建一个新的Hazaa实例时,应该通过设置时间戳来终止旧的Hazaa实例 因此,对于单个元素,我应用如下方法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
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();
}