2017-02-17 8 views
0


私はSQLite.netとSQLite-Net Extensionsを使用しています。私は多対多の自己関係を作りたいと思っています。
私の場合、私はいくつかの兄弟を持つ子クラスを持っていますが、もちろん兄弟はまだ子タイプです。

子クラス多対多「自己」相関SQLite:可能ですか?

[ManyToMany(typeof(Brotherhood), CascadeOperations = CascadeOperation.All)] 
public List<Child> Siblings_DB { get; set; } 

同胞クラス

class Brotherhood 
{ 
    [ForeignKey(typeof(Child))] 
    public int ID_child1 { get; set; } 

    [ForeignKey(typeof(Child))] 
    public int ID_child2 { get; set; } 

} 

すべての作業のようになります。したがって、私は、多対多の関係を実装しようとしました。
その後、私はChildを作成し、Siblingsリストに兄弟を追加し、私はInsertOrReplaceWithChildren(Child,true)を使用してDBにクラスを保存しようとするだけID_child1が任意のアイデアを更新し、0
ID_child2滞在されますか?私は間違って何をしていますか?
アレックス

+0

同じ質問..次の項目を確認してください:http://stackoverflow.com/questions/14227468/in-sqlite-how-to-implement-a-many-to-many-relationship –

答えて

0

私は多対多の自己関係を実現するためにいくつかの試みをした後、同じクラスで2つの多くの関係を混同していました。私はどちらが「公式」なのか疑問に思っていました。最終的に私は両方があったことを理解しました!そして、兄弟の合計は2つのリストの合計です。

[ManyToMany(typeof(Brotherhood), "ChildID1", "Siblings_DB_support", CascadeOperations = CascadeOperation.All)] 
public List<Child> Siblings_DB { get; set; } 
[ManyToMany(typeof(Brotherhood), "ChildID2", "Siblings_DB", CascadeOperations = CascadeOperation.All)] 
public List<Child> Siblings_DB_support { get; set; } 

そして関係表:このシナリオでは

public class Brotherhood 
{ 
    [ForeignKey(typeof(Child))] 
    public int ChildID1 { get; set; } 

    [ForeignKey(typeof(Child))] 
    public int ChildID2 { get; set; } 
} 
0

データベーススキーマは、最初に実行しようとしているものと互換性がなければなりません。 の片側はすべての関係はキー(一意の)属性または属性のセットでなければならないため、多対多の関係は単独ではできません。しかし、関連する行を保持する別のテーブルを作成し、その上に関連を作成しようとしている1つのテーブルの2つのキー属性[s]を含む結合キーを使用すると、それを実行できます。

は、テーブルキーがmyPKであると言う、その後、名前の第二のテーブルを作成し、含有する二列の主キーは、一緒にこの新しいテーブルのPKを形成とmyPK2を、属性とmyM2Mを言って、その後の両者の関係を形成しますこれらの列は、最初の表のmyPK列です。

あなたはthisを見ましたか?

+0

私の範囲はORMを使用してこの関係を作成することです。生のSQLite言語。 2つの異なるクラスの間で多くの関係が行われる場合、すべてが機能します。さらに、私は既に、「第二の」テーブルを作りました。私が同じクラスを使うと何かが間違っています。私は例を見てみましょう –

0

明示的にproperty属性に外部キーと逆の関係を指定する必要があります。

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

    public string Name { get; set; } 

    [ManyToMany(typeof(FollowerLeaderRelationshipTable), "LeaderId", "Followers", 
     CascadeOperations = CascadeOperation.All)] 
    public List<TwitterUser> FollowingUsers { get; set; } 

    // ReadOnly is required because we're not specifying the followers manually, but want to obtain them from database 
    [ManyToMany(typeof(FollowerLeaderRelationshipTable), "FollowerId", "FollowingUsers", 
     CascadeOperations = CascadeOperation.CascadeRead, ReadOnly = true)] 
    public List<TwitterUser> Followers { get; set; } 
} 

// Intermediate class, not used directly anywhere in the code, only in ManyToMany attributes and table creation 
public class FollowerLeaderRelationshipTable { 
    public int LeaderId { get; set; } 
    public int FollowerId { get; set; } 
} 

あなたの関係ではなく、「親子」の「兄・弟」である場合には、例えば、双方の関係を合計する必要があります:ここ

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

    public string Name { get; set; } 

    [ManyToMany(typeof(BrothersRelationshipTable), "OldBrotherId", "YoungerBrothers", 
     CascadeOperations = CascadeOperation.All)] 
    public List<Person> OlderBrothers { get; set; } 

    [ManyToMany(typeof(BrothersRelationshipTable), "YoungBrotherId", "OlderBrothers", 
     CascadeOperations = CascadeOperation.CascadeRead, ReadOnly = true)] 
    public List<Brothers> YoungerBrothers { get; set; } 

    [Ignore] 
    publc List<TwitterUser> Brothers { 
     get { return YoungerBrothers.Concat(OlderBrothers).ToList() } 
    } 
} 

// Intermediate class, not used directly anywhere in the code, only in ManyToMany attributes and table creation 
public class BrothersRelationshipTable { 
    public int OldBrotherId { get; set; } 
    public int YoungBrotherId { get; set; } 
} 
関連する問題