2017-09-22 8 views
1

他のオブジェクトに関連するオブジェクトにナビゲートしようとしています。データベースからフェッチされた、他のオブジェクトに関連するSQLiteオブジェクトに移動します。

この場合、2つのクラスがあります。 StockTakeSessionおよび位置。これらの2つは1対1の関係にあります。各クラスのオブジェクトが2つ作成されている場合、以下のコードのように関係を設定します。私は好きなように何も問題なくナビゲートすることができます。 データベースからStockTakeSessionを取得するとき、LocationIdに値があり、Location自体がnullの場合。これを解決するため、StockTakeSession.Locationの拡張getメソッドを作成しました。

私は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; } 

} 

:sqliteのネット・エクステンションで

StockTakeSession newSession = new StockTakeSession 
{ 
    LocationId = selectedLocation.Id, 
    Location = selectedLocation, 
    DateTime = DateTime.Now 

}; 

db.Insert(newSession, true); 

答えて

2

を、関係があります要求に応じてロードされません。必要なときにデータベースからフェッチする必要があります。

Locationの実装を単純なゲッタ/セッタに変更します。

その後
[OneToOne] 
public Location Location { get; set; } 

、あなたがそれを必要とするときに、セッションの関係をロードします。

db.GetChildren(session); 

例えば:

db.GetWithChildren<StockTakeSession>(stockId); 

は、そのIDでStockTakeSessionオブジェクトを取得し、また関係をロードし、設定します逆関係。

+0

ありがとうございます!これはうまく動作します! – Robert

関連する問題