Циркулярные ссылки при использовании sqlite-net с WCF - PullRequest
0 голосов
/ 06 сентября 2018

Я сталкиваюсь с круговыми ссылками при использовании sqlite-net extensions с WCF. Код ниже будет работать правильно, но у меня нет ссылки от RabbitQueueStat до RabbitQueue. Если я раскомментирую строки в RabbitQueueStat, произойдет что-то не так. Хотя db.GetAllWithChildren<RabbitQueue>().ToList(); даст мне допустимые значения, однако я получаю сообщение об ошибке return queues.

enter image description here

Если я установлю точку останова на RabbitQueue и RabbitQueueStat, я вижу, что получаю бесконечный цикл. Что я могу с этим сделать?

public class RabbitQueue
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }

    [OneToMany]
    public List<RabbitQueueStat> RabbitQueueStats { get; set; }
}

public class RabbitQueueStat
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public int Ack { get; set; }

    [ForeignKey(typeof(RabbitQueue))]
    public int RabbitQuqueId { get; set; }

    //[ManyToOne]
    //public RabbitQueue RabbitQueue { get; set; }
}

public List<RabbitQueue> GetQueues()
{
    var db = getConnection();
    var queues =  db.GetAllWithChildren<RabbitQueue>().ToList();
    return queues;
}

public int InsertQueue(string name, string iban)
{
    var queue = new RabbitQueue()
    {
        Name = name,
        Iban = iban,
        RabbitQueueAverageStats = new List<RabbitQueueAverageStat>(),
        RabbitQueueStats = new List<RabbitQueueStat>()
    };

    var db = getConnection();
    var inserted = db.Find<RabbitQueue>(x => x.Name == name && x.Iban == iban);
    if (inserted != null)
        return inserted.Id;
    else
        return db.Insert(queue);
}

public void InsertQueueStat(int queueId, int ack)
{
    var queueStat = new RabbitQueueStat()
    {
        Ack = ack,
    };

    var db = getConnection();
    var queue = db.Find<RabbitQueue>(x => x.Id == queueId);
    if (queue != null)
    {
        db.Insert(queueStat);

        if (queue.RabbitQueueStats == null)
            queue.RabbitQueueStats = new List<RabbitQueueStat>();

        queue.RabbitQueueStats.Add(queueStat);
        db.UpdateWithChildren(queue);
    }
}

Чтобы было понятно:

  • После добавления RabbitQueue без каких-либо RabbitQueueStat всего работает нормально
  • После комментирования public RabbitQueue RabbitQueue { get; set; } все работает нормально
  • Проблема появляется, когда мне назначено хотя бы 1 RabbitQueueStat RabbitQueue с некомментированными строками в RabbitQueueStat.
...