我正在使用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();
需要分离吗?这是好的做法吗?
答案 0 :(得分:1)
这当然是不好的做法,因为现在应用程序中有两个will
个对象,它们具有相同的密钥。其中一个是独立的“虚拟”,只会失去对它的任何写入。这容易出错并且令人困惑。
也许你的应用程序没有使用EF,因为它应该被使用。通常,根本没有很多附着和拆卸。 EF对象意味着表示数据库状态的“实时”对象。它们不是您随意创建并丢弃的DTO。特别是避免使用MyRepository.AddOrUpdate
等临时实体的通用仓库方法。
如果要写入实体,请获取并写入。不要创建新的实体进行更新。