3

我遇到了 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);
4

0 回答 0