Перейдите к объекту SQLite, связанному с другим объектом, извлеченным из базы данных.
Я пытаюсь перейти к объекту, связанному с другим объектом.
В этой ситуации есть 2 класса; StockTakeSession и Местоположение. Эти 2 имеют отношение один к одному. Когда есть 2 объекта, созданные для каждого класса, и я устанавливаю отношение как в коде ниже. Я могу перемещаться по нему, как мне нравится, без каких-либо проблем. Но когда я получаю StockTakeSession из базы данных, только LocationId имеет значение, а само Location является нулевым. Чтобы решить эту проблему, я создал расширенный метод get для StockTakeSession.Location.
Я совершенно новичок в C#/SQLite/ORM, поэтому мне было интересно, если это так, как это должно работать, или мне нужно использовать другой подход?
Спасибо за любое предложение.
Роберт
Это 2 класса:
// These are the Stock Take Sessions
public class StockTakeSession : DomainModels
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public DateTime DateTime { get; set; }
// Navigation properties
// One to many relationship with StockItems
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<StockItem> StockItems { get; set; }
// Specify the foreign key to Location
[ForeignKey(typeof(Location))]
public int LocationId { get; set; }
// One to one relationship with Location
private Location location;
[OneToOne]
public Location Location
{
get
{
if (location == null)
{
DataBase db = new DataBase();
Location locationTemp = db.SelectLocation(LocationId);
return locationTemp;
}
else
return location;
}
set
{
location = value;
}
}
}
// These are the Locations where the Stock Take Sessions are done
public class Location : DomainModels, IComparable<Location>
{
[JsonProperty("id"), PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
public string Street { get; set; }
public int Number { get; set; }
public string Postcode { get; set; }
public string City { get; set; }
public bool Completed { get; set; }
[Ignore]
public string Label
{
get
{
return Name + " - (" + Postcode + ")";
}
}
public int CompareTo(Location other)
{
return Name.CompareTo(other.Name);
}
// Navigation property
// One to many relationship with StockItems
[OneToMany(CascadeOperations = CascadeOperation.All), Ignore]
public List<StockItem> StockItems { get; set; }
// Specify the foreign key to StockTakeSession
[ForeignKey(typeof(StockTakeSession))]
public int StockTakeSessionId { get; set; }
// One to one relationship with StockTakeSession
[OneToOne]
public StockTakeSession StockTakeSession { get; set; }
}
Как я храню отношения между объектами:
StockTakeSession newSession = new StockTakeSession
{
LocationId = selectedLocation.Id,
Location = selectedLocation,
DateTime = DateTime.Now
};
db.Insert(newSession, true);
1 ответ
В sqlite-net-extensions отношения не загружаются по требованию. Вы должны получить их из базы данных, когда они вам нужны.
Измените вашу реализацию на Location
к простому получателю / установщику.
[OneToOne]
public Location Location { get; set; }
Затем загрузите отношения сеанса, когда вам это нужно:
db.GetChildren(session);
Например:
db.GetWithChildren<StockTakeSession>(stockId);
Принесу StockTakeSession
объект с этим идентификатором, а также загрузить отношения и установить обратные отношения.