更新记录时是否需要分离?
Is detach necessary when updating record?
我正在与 VS2013
、.NET4.5
、EF6
和 SQL 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
采用临时实体。
如果你想写一个实体,获取它并写入。不创建用于更新的新实体。
我正在与 VS2013
、.NET4.5
、EF6
和 SQL 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
采用临时实体。
如果你想写一个实体,获取它并写入。不创建用于更新的新实体。