我尝试过读取文档,但是我不明白为什么更新方法会产生一个“重复条目”MySQL错误。
医生说
在其最简单的形式中,不带任何筛选器的任何模型更新都将更新每个字段,但用于筛选更新到此特定记录的Id除外:
所以我试了一下,然后传入一个物体,如下所示。id 2的行已经存在。
using (var _db = _dbFactory.Open())
{
Customer coreObject = new Customer(...);
coreObject.Id = 2;
coreObject.ObjectName = "a changed value";
_db.Update<Customer>(coreObject); // <-- error "duplicate entry"
}是的,有使用.Save之类的选项,但是.Update缺少什么呢?当我阅读它时,它应该使用其Id属性来更新db中的行,而不是插入新行?

发布于 2018-06-26 22:39:55
此方法的问题是您正在更新一个通用对象T,但是您的Update要求更新具体的Customer类型:
public void MyTestMethod<T>(T coreObject) where T : CoreObject
{
long id = 0;
using (var _db = _dbFactory.Open())
{
id = _db.Insert<T>(coreObject, selectIdentity: true);
if (DateTime.Now.Ticks == 0)
{
coreObject.Id = (uint)id;
_db.Delete(coreObject);
}
if (DateTime.Now.Ticks == 0)
{
_db.DeleteById<Customer>(id);
}
if (DateTime.Now.Ticks == 0)
{
coreObject.Id = (uint)id;
coreObject.ObjectName = "a changed value";
_db.Update<Customer>(coreObject);
}
}
}哪个OrmLite假设您使用不同的/匿名对象来更新customer表,类似于:
db.Update<Customer>(new { Id = id, ObjectName = "a changed value", ... });因为它没有WHERE过滤器,所以它将尝试用相同的主键更新所有行。
相反,您希望更新相同的实体,要么传入泛型类型T,要么通过不传递任何类型来推断它,例如:
_db.Update<T>(coreObject);
_db.Update(coreObject);它将通过更新每个字段来使用OrmLite的更新实体行为,除了在WHERE表达式中使用的主键之外,它将更新限制为只更新该实体。
v5.1.1中的新行为
为了防止意外的误用,我在此承诺中添加了Update重载,在使用匿名对象更新实体时,它将使用主键作为筛选器,因此您以前的使用:
_db.Update<Customer>(coreObject);将主键添加到WHERE筛选器中,而不是将其包含在设置列表中。此更改可从v5.1.1即现在的可在MyGet上获得中获得。
https://stackoverflow.com/questions/51051302
复制相似问题