我遇到CoolStorage的问题,当第一次读取列表时,正在缓存OneToMany关系,该列表在数据稍后更改时无法更新。
重新启动我的应用程序时,列表是正确的,因此它必须是缓存问题,我无法在CoolStorage文档或任何地方找到解决方案。
我已粘贴下面的单元测试代码。
我有一个Game类,其中包含Person类型的对手。有许多游戏,一个人可以成为许多游戏的对手。
我的Person类有一个名为OpponentGames的CSList
,所以在任何时候我都可以说'得到这个人是对手的游戏'。
在第一次引用'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);