我遇到了 CoolStorage 的问题,其中在第一次读取列表时缓存了 OneToMany 关系,然后当数据稍后更改时,该列表无法更新。
重新启动我的应用程序时,列表是正确的,所以它一定是一个缓存问题,我在 CoolStorage 文档或任何地方都找不到解决方案。
我在下面粘贴了我的单元测试代码。
我有一个具有 Person 类型的 Opponent 的 Game 类。有很多游戏,一个人可以是很多游戏的对手。
我的 Person 类有一个CSList
名为 OpponentGames,所以在任何时候我都可以对那个人说“获取这个人是对手的游戏”。
在单元测试中我第一次引用“person.OpponentGames.Count”时,它正确地告诉我有一个游戏。创建第二个游戏并将我的人添加为对手后,它仍然会为 OpponentGames 报告一场游戏。
如果我删除第一个计数,则测试通过,因此第一个检查结果将被缓存,并且不会从那里更新。
我将不胜感激任何建议!谢谢。
SQL (sqlite3)
设置:
CSDatabase.ExecuteNonQuery(
"CREATE TABLE Person " +
"(ServerId INTEGER PRIMARY KEY)");
CSDatabase.ExecuteNonQuery(
"CREATE TABLE Game " +
"(ServerId INTEGER PRIMARY KEY," +
"OpponentId INTEGER REFERENCES User(ServerId))");
CoolStorage .Net 类:
[MapTo("Game")]
public class Game : CSObject<Game,int>
{
//[PrimaryKey]
public int ServerId { get { return (int) GetField("ServerId"); } set { SetField("ServerId", value); } }
[ManyToOne (LocalKey="OpponentId", ForeignKey="ServerId")]
public Person Opponent { get { return (Person) GetField("Opponent"); } set { SetField("Opponent", value); } }
}
[MapTo("Person")]
public class Person : CSObject<Person,int>
{
//[PrimaryKey]
public int ServerId { get { return (int) GetField("ServerId"); } set { SetField("ServerId", value); } }
[OneToMany (LocalKey="ServerId", ForeignKey="OpponentId")]
public CSList<Game> OpponentGames { get { return (CSList<Game>) GetField("OpponentGames"); } }
}
最后,单元测试:
// user
Person person = Person.New ();
person.ServerId = 1;
// first game
Game game = Game.New ();
game.ServerId = 1;
game.Opponent = person;
game.Save ();
person.Save ();
// this line correctly returns 1, removing this passes the test
Console.WriteLine ("count0: " + person.OpponentGames.Count);
// second game
Game game2 = Game.New ();
game2.ServerId = 2;
game2.Opponent = person;
game2.Save ();
person.Save ();
// this incorrectly shows 1, should be 2
Console.WriteLine ("count1: " + person.OpponentGames.Count);
// and it fails
Assert.True (person.OpponentGames.Count == 2);