2015-04-01 6 views
0

Пожалуйста, простите стену кода, но мне нужно, чтобы установить сцену ....многие ко многим отношения не обновляется в SQLite Extensions

public class Student 
{ 
    public string Name { get; set; } 
    [PrimaryKey] 
    public string Id { get; set; } 

    [ManyToMany(typeof(StudentStaff))]   
    public List<Staff> Teachers { get; set; } 

    [ManyToMany(typeof(StudentGuardian))] 
    public List<Guardian> Guardians { get; set; } 
} 

    public class Guardian 
    { 
     [PrimaryKey] 
     public string Id { get; set; } 
     public string Name{get;set;}  

     [ManyToMany(typeof(StudentGuardian))] 
     public List<Student> Students { get; set; } 
    } 

public class Staff 
{ 
    [PrimaryKey] 
    public string Id { get; set; } 
    public string Name { get; set; } 

    [ManyToMany(typeof(StudentStaff))] 
    public List<Student> Students { get; set; } 
} 

public class StudentStaff 
{ 
    [ForeignKey(typeof(Student))] 
    public string StudentId { get; set; } 
    [ForeignKey(typeof(Staff))] 
    public string StaffId { get; set; } 
} 

public class StudentGuardian 
    { 
     [ForeignKey(typeof(Student))] 
     public string StudentId { get; set; } 
     [ForeignKey(typeof(Guardian))] 
     public string GuardianId { get; set; } 
} 

Учитывая эти классы, как я должен вставить студентов, сотрудников и опекуны в базу данных при сохранении отношений? Я должен отметить, что сервер возвращает заполненные записи Студента, так что это моя отправная точка.

Я попробовал conn.InsertOrReplaceWithChidlren(student); ... который вставил ученика, студента и учеников, но не фактического штата или опекуна. Я попытался conn.InsertOrReplaceWithChildren(student); conn.InsertOrReplaceWithChildren(student.Teachers); conn.InsertOrReplaceWithChildren(student.Guardians); Как ни странно, что в конечном итоге с персоналом, попечителя и учителей вставлено но ни одна из таблиц пересечения имели какие-либо данные ...

--update --- Я просто попытался conn.InsertOrReplaceWithChildren(student.Teachers); conn.InsertOrReplaceWithChildren(student.Guardians); conn.InsertOrReplaceWithChildren(student); И это сработало отлично ... вопрос в том, почему? Почему многие из многих, похоже, зависят от порядка операций?

ответ

1

Расширения SQLite-Net требуют, чтобы всем объектам был присвоен уникальный идентификатор, чтобы установить отношения. С основными ключами AutoIncrement это означает, что все объекты уже вставлены в базу данных.

Заказ может также повлиять на то, что обратные отношения не были установлены, обычно рекомендуется установить обратную связь или установить эти атрибуты как ReadOnly, чтобы избежать побочных эффектов.

С учетом того, что SQLite-Net Extensions предоставляет утилиты для помощи в решении этой задачи. В этом случае вы можете использовать каскадные операции для выполнения одной вставки. Чтобы включить каскадные операции, определить CascadeOperations свойство атрибута отношений:

public class Student 
{ 
    public string Name { get; set; } 
    [PrimaryKey] 
    public string Id { get; set; } 

    [ManyToMany(typeof(StudentStaff), CascadeOperations = CascadeOperation.All)]   
    public List<Staff> Teachers { get; set; } 

    [ManyToMany(typeof(StudentGuardian), CascadeOperations = CascadeOperation.All))] 
    public List<Guardian> Guardians { get; set; } 
} 

    public class Guardian 
    { 
     [PrimaryKey] 
     public string Id { get; set; } 
     public string Name{get;set;}  

     [ManyToMany(typeof(StudentGuardian), CascadeOperations = CascadeOperation.All, ReadOnly = true))] 
     public List<Student> Students { get; set; } 
    } 

public class Staff 
{ 
    [PrimaryKey] 
    public string Id { get; set; } 
    public string Name { get; set; } 

    [ManyToMany(typeof(StudentStaff), CascadeOperations = CascadeOperation.All, ReadOnly = true))] 
    public List<Student> Students { get; set; } 
} 

В этом примере я также включал ReadOnly свойство, чтобы Guardian и Staff отношения к Student свойство только для чтения, так SQLite-Net Extensions будет игнорировать это при сохранении объектов в базе данных.

Затем, вы можете использовать параметр любого метода SQLite-Net Extensions recursive к true:

conn.InsertOrReplaceWithChildren(student, recursive: true); 

SQLite-Net Extensions будет обрабатывать обратные связи и отношения правильно петлями.

+0

Хммм Мне нравится чтение, я дам остальное вихрь и дам вам знать. Я не уверен на 100%, почему вы упомянули ключи автоинкремента. Мои образцы не имеют ни одного из них. – user3589700