2011-08-21 85 views
4

的集合打补丁假设我有以下领域:RavenDB - 在非规范化的引用

public class Movie 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public List<ActorReference> Actors { get; set; } 
} 

public class Actor 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Biography { get; set; } 
    public string AnotherDetailProperty { get; set; } 
} 

public class ActorReference 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

现在,如果我要确保演员的名称更改,所有引用电影更新。因此,我首先创建这让我查询在一个特定的演员参与的所有电影索引:

public class Movies_ByActorId : AbstractIndexCreationTask<Movie> 
{ 
    public Movies_ByActorId() 
    { 
     Map = movies => from movie in movies 
         from actor in movie.Actors 
         select new { ActorId = actor.Id }; 
    } 
} 

好了,现在我想火补丁命令

Session.Advanced.DatabaseCommands.UpdateByIndex(
    "Movies/ByActorId", 
    new IndexQuery 
    { 
     Query = "ActorId:" + actorWhoseNameHasChanged.Id 
    }, 
    new[] 
    { 
     new PatchRequest 
     { 
      Type = PatchCommandType.Modify, 
      Name = "Actors", 
      Nested = new[] 
      { 
       // WHAT TO DO HERE? 
      } 
     } 
    }, 
    allowStale: false); 

有人可以帮我完成上面的代码块,因为我完全不知道,我怎么只能更新代表已更改actor的非规范化引用的名称。

恐怕RavenDB不支持这种补丁请求的,我需要手动加载和存储所有的电影,这是我肯定会想避免因为性能原因。

回答

1

RavenDB不支持做基于标准的修补。 您可以解决您的问题,而不需要非标准化的参考文献,并可在读取时使用include。