2017-02-20 13 views
0

У меня есть следующий объект json, где я пытаюсь сохранить их в двух разных таблицах в sqlite. Вот сценарий, я сначала загружаю набор учеников и проверяю базу данных, и все выглядит великолепно.Реляционная база данных OneToMany

Однако, когда я получаю еще один набор учеников для вставки в существующие таблицы. несколько StudentId получает NULL для первого набора наборов данных, но последний набор StudentId набора данных является правильным.

Подробнее у вас есть такие же studentId в таблице StudentSpecifications. Если второй набор данных, который будет вставлен, имеет то же самое значение StudentId, это влияет на первый набор данных и делает их NULL, но второй набор данных StudentId является правильным.

StudentId используется как ForeignKey. Я подозреваю, что я использую отношения OnetoMany, но я не знаю, как обращаться?

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

Вставка в таблицу

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

Вы можете написать код для 'Student.cs'? Это кажется неполным, и вы не можете комментировать класс OneToMany. – redent84

+0

@ redent84, вы правы, это моя ошибка. Я добавил недостающую часть. – hotspring

ответ

1

Вы перекрывая отношения каждый раз, когда вы сохраните новый набор данных здесь:

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

Так что ваш старый StudentSpecifications будет удален из соотношения в базе данных, установив внешний ключ null.

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

Как вы уже назначая внешний ключ вручную, вы можете просто вставить объекты, используя простую SQLite-Net методы:

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

Таким образом, ваши старые отношения не будут удалены, а результаты будут объединены в следующий раз, когда вы загрузите их из базы данных.