【问题标题】:RavenDB: How do you update child entities?RavenDB:你如何更新子实体?
【发布时间】:2013-01-23 00:13:18
【问题描述】:

我一直在玩 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 工作原理的误解。我找不到这样的例子。处理这种情况的最佳做法是什么?

【问题讨论】:

    标签: parent ravendb


    【解决方案1】:

    不,它不会执行您描述的任何操作。按照您建模的方式,数据库中有两个单独的文档:

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

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

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

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

    您通常只想使用IList&lt;string&gt; CourseIds。不需要非规范化。查看this documentation 了解更多详情。

    【讨论】:

      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2013-07-24
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多