在RavenDB中指定集合名称

30
假设我有三个对象Fruit、Apple和Orange。 Fruit 是 Apple 和 Orange 的抽象基类。当我使用 session.Store(myApple) 时,它将其放入 Apples 集合中。myOrange 存储在 Oranges 集合中。这很有道理。
我能告诉 Raven 我想要一个 Fruits 集合来容纳 Apples 或 Oranges 吗?MongoDB 允许这样做,因为它允许我显式指定集合名称。RavenDB 文档中关于集合的说明是:
“预期使用模式是将文档与相似结构分组到集合中,尽管不是必需的。从数据库的角度来看,集合只是共享相同实体名称的一组文档。”
我期望它是这样的:session.Store<Fruit>(myApple),或者 session.Store("Fruits", myApple)
有什么想法吗?谢谢。

这些似乎与您的问题相似。我会尝试这个,但目前无法做到。 http://groups.google.com/group/ravendb/browse_thread/thread/eb86c2ffd29ed5e/11644a7eaddaf123?lnk=gst&q=Inheritance#11644a7eaddaf123 http://mikehadlow.blogspot.com/2010/10/ravendb-playing-with-inheritance-and.html - Derek Beattie
1个回答

39

你可以这样做:

session.Store(apple);
session.Advanced.GetMetadataFor(apple)[Constants.RavenEntityName] = "Fruits";

那是一种很繁琐的方法。 一个更好的方式是全局添加这个逻辑,看起来像这样:

store.Conventions.FindTypeTagName = 
   type => type.IsSubclassOf(typeof(Fruit)) ? 
       DocumentConvention.DefaultTypeTagName(typeof(Fruit)) : 
       DocumentConvention.DefaultTypeTagName(type);

那将为所有事情处理此事。


对于.NET Core,您需要使用type.GetTypeInfo().IsSubclassOf(typeof(Fruit))(来自System.Reflection)或typeof(Fruit).IsAssignableFrom(type)链接)。请记住一些关于IsAssignableFrom的注意事项(链接)。 - Alex Klaus
为了更好地理解这个答案,请查看此处 https://ravendb.net/docs/article-page/3.5/all/client-api/session/configuration/how-to-customize-collection-assignment-for-entities - pomarc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接