我有一个linq对象,当某些方面发生变化并调用Save()
方法时,我想“退休”。数据库通过使用Terminated列来执行此操作,该列在设置时会导致在后续查询中忽略该对象。我想透明地这样做,例如:
DataContext db = new DataContext();
Foo bar = (from a in db.table
where a.pk == somevalue
select a).Single();
bar.Price += 2;
Console.WriteLine(bar.pk);
bar.Save();
Console.WriteLine(bar.pk);
第二个WriteLine()
应该是与第一个不同的键,因为在保存过程中我创建了一个重复的对象并用它替换了它。基本上在save方法中我想设置this = newObj;
。我想要的是什么,还是以错误的方式解决这个问题?
答案 0 :(得分:1)
如果通过引用传递引用,则可以更改引用(或更准确地说是包含它们的变量):
class Foo {
...
public static void Save(ref Foo obj)
{
var newObj = obj._save() //your implementation
obj = newObj;
}
}
没有其他方法可以更改引用。原因是,对象不知道它们被引用的位置。 Foo对象不知道对它的任何引用。
如果您想要在代码中列出的确切行为,实现此目的的唯一方法是更改Foo实例的内容,即使用更新的值覆盖每个字段。
希望这有帮助。
答案 1 :(得分:0)
另一种方法是从Save()方法返回新对象;如果Save()方法不是对象的一部分,这可能更有意义。例如:
var dataPersister = new DataPersister();
var obj = dataPersister.Load(somevalue);
obj.Price += 2;
var newObj = dataPersister.Save(obj);
在这些调用之后,obj仍将指向原始对象,newObj将是保存后的结果。