Как превратить отношение «один ко многим» в свойство списка с помощью SauceDB? - PullRequest
1 голос
/ 18 августа 2011

Используя SauceDB, как превратить отношение «один ко многим» между, скажем, таблицей «A» и таблицей «B» соответственно, в свойство списка (содержащее объекты B) в классе, соответствующем таблице A? Отношение представлено внешним ключом в таблице B, ссылающимся на таблицу A (так что многие записи B могут принадлежать одной записи A).

Ответы [ 2 ]

0 голосов
/ 18 августа 2011

Sauce не поддерживает навигационные свойства в стиле Linq2SQL.Однако есть два поддерживаемых способа обойти это в зависимости от ваших требований.

1) Просто выполните объединение в своем коде

IDataStore dstore = .GetDataStore ();

var query = from i in dstore.Query<MyTable>()
            join x in dstore.Query<MyTable>() on i.Name equals x.Name
            select new {  };

2) Другой способ сделать это заключается в следующем, и дает более широкое использование стиля свойств навигации.Измените определение вашего объекта так, чтобы оно содержало список, и используйте [AdditionalInit]

public class Foo
{
  public int ID { get; set; }
  public string Name { get; set; }

  [IgnoredField]
  public List<Bar> Bars { get; set; }

  [AdditionalInit]
  private void LoadBars(IDataStore dstore)
  {
    Bars = dstore.Query<Bar>().Where(r=> r.Foo = this.ID).ToList();
  }
}

Это должно делать то, что вы ищете, если у вас есть еще вопросы, дайте мне знать.

0 голосов
/ 18 августа 2011

Я обнаружил, что могу использовать атрибут AdditionalInit, чтобы определить ловушку, которая вызывается при инициализации объекта базы данных.Так как этот хук может принимать хранилище данных, я могу прямо здесь вывести отношение один ко многим.

Вот соответствующая выдержка из класса A:

public class A
{
    ...

    public List<B> Bs { get; private set; }

    [AdditionalInit]
    public void OnInit(IDataStore dstore)
    {
        Bs = dstore.Query<B>().Where(b => b.A.Id == Id).ToList();
    }
}

Имейте в виду, у меня есть убежищееще не смог протестировать этот код.

...