我有一些C#代码,如下所示:
foreach (car c in listOfCars) {
c.garage.last_opened_at = DateTime.Now;
}
db.SubmitChanges();
基本上,cars
和garages
是一对一的关系(我知道这是一个有点缺陷的例子),而且我正在更新每个车库最后一次打开的时间。
但是,当我检查数据库时,last_opened_at
字段没有被更新(没有显示错误消息)。有什么建议吗?我环顾了SO和谷歌,我看到的所有解决方案都提到garage
需要一个主键。但是我仔细检查过,我的garage
表确实使用其外键作为主键来关联汽车。
主键是否也加倍作为外键的问题(即,我是否需要专用的主键列)?
答案 0 :(得分:1)
这里几乎没有可能:last_opened_at
被指定为数据库提供的字段,你的linq上没有列出一个主键到sql类,你的listOfCars
不太可能来自相同的数据库上下文。
如果您将字段标记为由数据库生成,这是使用带有数据库默认值的时间戳或字段的典型方案,则linq to sql将永远不会尝试写入该属性。
如果linq到sql类没有主键,无论数据库在做什么,它都不会写入表。主键也是外键不应该是一个问题,只要它是主键。我曾经遇到过这个问题并且认为我在这种情况下记得错误,但我并不是百分百肯定。
如果从一个数据上下文生成listOfCars
,并尝试将它们保存在另一个数据上下文中,则第二个数据上下文不知道这些实体是否存在。您可以通过确保使用相同的数据上下文或将实体附加到新上下文来解决此问题。
答案 1 :(得分:0)
如果您将呼叫转移到循环中的SubmitChanges
,该怎么办?
foreach (car c in listOfCars) {
c.garage.last_opened_at = DateTime.Now;
db.SubmitChanges();
}
答案 2 :(得分:0)
您错过了实际更新模型的电话。我相信你的例子应该是这样的:
foreach(car c in listOfCars) {
c.garage.last_opened_at = DateTime.Now;
}
db.AcceptAllChanges();
db.SubmitChanges();
此外,更新永远不会无声地失败。如果更新失败,它将抛出UpdateException。在您的情况下发生的是您的代码将更新但看不到模型中接受的更新,因此不会更新任何内容。如果您遇到主键或外键约束问题,则会出现异常。