0

我一直在玩 RavenDB。我不得不说我印象深刻,但我很难理解如何更新子对象。例如,假设我们有以下内容:

public class Course
{
    public int Id { get; set; }
    public string Title { get; set; }
}

public class Student
{
    public Student()
    { 
        Courses = new Collection<Course>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Course> Courses { get; set; }
}

我可以在数据库中保存一个学生和两个与学生相关的课程。我也可以毫无问题地为学生加载两门课程。但是当我尝试修改课程时,例如 student.Courses.Add(new Course { Id = 5, Title = "Accounting 101"}),我希望它能够在数据库中的内容与当前的内容之间进行同步学生。课程。基本上,我希望它删除数据库中的课程,并且只在 student.Courses 中有课程。这可能是我对 RavenDB 工作原理的误解。我找不到这样的例子。处理这种情况的最佳实践方法是什么?

4

1 回答 1

1

不,它不会做你描述的任何事情。您对其建模的方式,数据库中有两个单独的文档:

Course
{
  Id : "courses/1",
  Title : "Algebra"
}

Student
{
  Id : "students/1",
  Name : "John",
  Courses :
    [
      {
        Id : "courses/1",
        Title : "Algebra"
      }
    ]
}

Course非规范化的好处是您在查看信息以获得课程标题时Student不必加载Course文档。Student

Course不利的一面是必须对两个文档进行任何更改。如果您只是将课程添加到学生文档,则它指的Course是不存在的文档。Raven 不会阻止你这样做。文档数据库中没有参照完整性约束。

在现实世界中,您可能会在将课程添加到学生之前添加课程,并且从课程中删除所有学生并不意味着没有课程。所以真的,只有像重命名课程这样的操作必须同时触及课程文档和所有具有关系的学生文档。

通常您只想使用IList<string> CourseIds. 不需要非规范化。查看此文档以获取更多详细信息。

于 2013-01-22T16:13:18.577 回答