2017-02-17 18 views
0


Я использую SQLite.net и SQLite-Net Extensions. Я хотел бы создать много ко многим отношениям.
В моем случае у меня есть детский класс с некоторыми братьями и сестрами, конечно же, братья и сестры по-прежнему имеют тип ребенка. Поэтому я попытался реализовать manytomany соотношение:

Детский классМногие для многих «я» -регуляция 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) обновляется только ID_child1 и ID_child2 пребывание 0.
Любая идея? Что я делаю не так?
Alex

+0

же вопрос здесь .. проверьте следующее: http://stackoverflow.com/questions/14227468/in-sqlite-how-to-implement-a-many-to-many-relationship –

ответ

0

После некоторых попыток, которым я сумел реализовать много-много самооценок, я был немного смущен тем, что у меня было два отношения многого в одном классе: мне было интересно, какой из них «официальный». В конце концов я понял, что оба были! И сумма братьев и сестер была суммой двух списков.

[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

Схема базы данных должна быть сначала совместима с тем, что вы пытаетесь сделать. Одна сторона : отношение должно быть ключевым (уникальным) атрибутом или набором атрибутов, так что вы не можете сами иметь самосознание «многие ко многим». Но если вы создаете другую таблицу для хранения связанных строк, с комбинированным ключом, который содержит две копии атрибута ключа [s] из одной таблицы, на которую вы пытаетесь создать отношение, тогда вы можете это сделать.

говорят ключ таблицы myPK, а затем создать вторую таблицу с именем, скажем, myM2M с двух столбцов первичного ключа, содержащий атрибуты и myPK2, которые вместе образуют рк этой новой таблицы, а затем образуют связь между обоими эти столбцы с столбцом myPK в первой таблице.

Вы посмотрели this?

+0

Моей целью является использование ORM для создания этого отношения, а не необработанный язык SQLite. Все работает, если отношение многих ко многим осуществляется между двумя разными классами.Более того, я уже создал «вторую» таблицу: братство, которое должно реализовать много-много отношений. Что-то не так, когда я использую тот же класс. Я рассмотрю пример thx –

0

В этом случае вы должны явно указать внешние ключи и обратные связи в атрибуте свойства.

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