简而言之,一个表中的一个特定记录会更新,而同一个表中的多个附加修改则不会更新。
theStat
在.SubmitChanges()
statToIncrease
个实例在SubmitChanges()
在观看.GetChangeSet()
时,仅执行一次更新。为什么修改后statToIncrease
的任何实例都没有更新?我是否必须为每次更新打开一个新的DataDataContext
?
UserStat
表has a primary key。
也许是另一个问题
用.Add(double amountToAdd)
之类的方法扩展我的UserStat类是否明智?必须打开另一个连接,但它允许我继续使用LINQ,对吗?
using (DataDataContext db = new DataDataContext())
{
Random r = new Random();
var theStat = db.UserStats.FirstOrDefault();
// tried scoping `statToIncrease` outside of the for loop
// didn't fix anything
UserStat statToIncrease = null;
for (int i = 0; i < vm.stats.Count(); i++)
{
statToIncrease = db.UserStats.Where(s => s.ID == i)
.FirstOrDefault();
// here, .Property is type float
statToIncrease.Property += r.NextDouble();
// here, .Property is type int
theStat.Property -= 1;
}
// create and insert another object
// this object is inserted correctly
// right here, .ChangeSet() only has one insert and one update
// the update is only for `theStat` and not
// any modifications to `statToIncrease`
db.SubmitChanges();
}
更新
我找到了这样做的丑陋方式:
db.ExecuteCommand("UPDATE [UserStat] SET [Value] = {0} WHERE [ID] = {1},
statToIncrease.Value + amount, statToIncrease.ID");
答案 0 :(得分:1)
我不确定究竟是什么问题,但是你重复使用相同的变量(statToIncrease
)并一次获取一条记录似乎很奇怪。获取对象列表,遍历列表并更新它们然后调用SubmitChanges
似乎更合理:
using (DataDataContext db = new DataDataContext())
{
var r = new Random();
UserStat theStat = db.UserStats.FirstOrDefault();
List<UserStat> statsToIncrease =
db.
UserStats.
Where(s => s.ID >= 0 && s.ID < vm.stats.Count()).
ToList();
foreach (UserStat statToIncrease in statsToIncrease)
{
statToIncrease.Property += r.NextDouble();
theStat.Property -= 1;
}
db.SubmitChanges();
}
答案 1 :(得分:0)
尝试使用以下方法显式附加修改后的实体:
db.UserStats.Attach(statToIncrease, true);
...
db.SubmitChanges();
我必须开一个新的 每个更新的DataDataContext?
不,你没有。
答案 2 :(得分:0)
这是你的问题:
.Where(s => s.ID == 1).FirstOrDefault();
这显然会在每次迭代时返回相同的对象。而且我猜测theStat的ID为1,这就是更新的原因。