2017-02-20 5 views
0

Ich habe das folgende json-Objekt, wo ich versuche, sie in zwei verschiedenen Tabellen in der SQLite zu speichern. Hier ist das Szenario, ich lade einen Schüler zuerst herunter und überprüfe die Datenbank, und alles sieht gut aus.OneToMany Relationale Datenbank

Allerdings, wenn ich eine andere Gruppe von Schülern in die vorhandenen Tabellen einfügen. einige StudentId 's erhalten NULL für die erste Menge des Datensatzes, aber die letzte Datenmenge StudentId ist richtig.

Im Detail haben Sie viele gleiche studentId in der StudentSpecifications Tabelle. Wenn der zweite Datensatz, der eingefügt werden soll, denselben StudentId hat, betrifft dies den ersten Datensatz und macht ihn NULL, aber der zweite Datensatz StudentId ist richtig.

StudentId wird als ForeignKey verwendet. Ich vermute, dass ich OnetoMany Beziehung verwende, aber ich weiß nicht, wie man damit umgeht?

Student: [ 
{ 
    StudentId: "3322449c-cd89-4633-ae3a-4578572eeeee", 
    Name: "Joseph Peter", 
    Qualification: "1222449c-efds-rfcs-asde-8546242kkkkk", 
    StudentSpecifications: [ 
    { 
    Id: "45e63840-0dc3-4296-a83d-97cc462b2dac", 
    EnrollDate: "2016-08-05T09:40:21.233", 
    GraduationDate: "2017-06-05T09:40:21.233", 
    }, 
    { 
    Id: "25fffe40-0dc3-4296-a83d-97cc462b2dac", 
    EnrollDate: "2015-07-05T09:40:21.233", 
    GraduationDate: "2016-08-05T09:40:21.233", 
    }, 
    } 
] 

Student.cs

[OneToMany(CascadeOperations = CascadeOperation.All)] 
public List<StudentSpecification> StudentSpecifications { get; set; } 

public Student(StudentDto dto) 
{ 
    Id = dto.StudentId.ToString(); 
    Name = dto.Name; 
    QualificationId = dto.QualificationId.ToString(); 
    StudentSpecifications= dto.StudentSpecification.Select(x => new StudentSpecification(x, Id)).ToList(); 
} 

StudentSpecification.cs

[Table("STUDENT_SPECIFICATIONS")] 
public class StudentSpecification 
{ 
    [PrimaryKey] 
    public string Id{get;set;} 
    [ForeignKey(typeof(Student))] 
    public string StudentId { get; set; } 
    public DateTime EnrollDate{ get; set; } 
    public DateTime GraduationDate{ get; set; } 

    public StudentSpecification(StudentDto dto, string studentId) 
    { 
     Id = Guid.NewGuid().ToString(); 
     StudentId = studentId; 
     EnrollDate= dto.EnrollDate; 
     GraduationDate= dto.GraduationDate; 
    } 

in die Tabelle einfügen

public bool AddOrUpdate(IEnumerable<T> entities, bool withChildren = false) 
{ 
    var db = _factory.GetConnectionWithLock(); 
    using (db.Lock()) 
    { 
    db.InsertOrReplaceAllWithChildren(entities, true); 
    return true; 
    } 
} 
+0

Können Sie den Code für 'Student.cs' veröffentlichen? Es scheint unvollständig zu sein, und Sie können nicht mit "OneToMany" eine Klasse kommentieren. – redent84

+0

@ redent84, Sie haben Recht, es ist mein Fehler. Ich habe das fehlende Stück hinzugefügt. – hotspring

Antwort

1

Sie überschreiben die Beziehung jedes Mal, wenn Sie Ihren neuen Datensatz hier sparen:

StudentSpecifications= dto.StudentSpecification.Select(x => new StudentSpecification(x, Id)).ToList(); 

So Ihre alten StudentSpecifications wird, indem der Fremdschlüssel null aus der Beziehung in der Datenbank entfernt werden.

Das Problem ist, dass Sie diese Ergebnisse zu merge wollen, so können Sie entweder Last vorherige Elemente aus der Datenbank und die Inhalte von Hand, oder die Beziehung manuell handhaben.

Wie Sie bereits den Fremdschlüssel manuell zuweisen, können Sie nur die Objekte einfügen Ebene SQLite-Net Methoden:

db.InsertOrReplace(student); 
for (var spec in student.StudentSpecifications) { 
    db.InsertOrReplace(spec); 
} 

Auf diese Weise Ihre alte Beziehungen werden nicht entfernt bekommen, und die Ergebnisse werden zusammengeführt Das nächste Mal, wenn Sie sie aus der Datenbank laden.

Verwandte Themen