更新记录时是否需要分离?

Is detach necessary when updating record?

我正在与 VS2013.NET4.5EF6SQL 2008 合作。

我注意到我们团队中的一位开发人员更改了

中的所有更新语句
if (!journey.WillAnswer.Any()) 
{
    db.WillAnswer.Add(willAnswer);
} 
else 
{
    db.WillAnswer.Attach(willAnswer);
    db.Entry(willAnswer).State = EntityState.Modified;
}

db.SaveChanges();

if (!journey.WillAnswer.Any()) 
{
    db.WillAnswer.Add(willAnswer);
} 
else 
{
    var will = db.WillAnswer.Single(x => x.Id == willAnswer.Id);

    db.Detach(will);
    db.WillAnswer.Attach(willAnswer);
    db.Entry(willAnswer).State = EntityState.Modified;
}

db.SaveChanges();

是否需要分离?这是好的做法吗?

这肯定是不好的做法,因为现在应用程序中有两个 will 对象浮动,它们具有相同的密钥。其中之一是分离的 "dummy" 并且只会丢失对其进行的任何写入。这很容易出错且令人困惑。

也许您的应用没有按照预期的方式使用 EF。通常,根本没有太多的附加和分离。 EF 对象是 "live" 表示数据库状态的对象。它们不是您随意创建并丢弃的 DTO。尤其要避免通用的回购方法,例如 MyRepository.AddOrUpdate 采用临时实体。

如果你想写一个实体,获取它并写入。不创建用于更新的新实体。