Entity framework 在Objectify中,如何在不知道父键的情况下按ID加载实体?

Entity framework 在Objectify中,如何在不知道父键的情况下按ID加载实体?,entity-framework,google-app-engine,objectify,Entity Framework,Google App Engine,Objectify,我在objectify中有一个实体组,典型的SomeParentClass和SomeChildClass。我想这样做,从数据存储中加载SomeChildClass的实例 ofy().load.type(SomeChildClass.class).id(idOfSomeChildClassInstace); 这将返回未找到的内容。似乎您需要知道SomeChildClass的父类才能从datestore获取它。我知道这很管用 Key<SomeChildClass> k = Key.cr

我在objectify中有一个实体组,典型的SomeParentClass和SomeChildClass。我想这样做,从数据存储中加载SomeChildClass的实例

ofy().load.type(SomeChildClass.class).id(idOfSomeChildClassInstace);
这将返回未找到的内容。似乎您需要知道SomeChildClass的父类才能从datestore获取它。我知道这很管用

Key<SomeChildClass> k = Key.create(someParentClass.generateKey(), SomeChildClass.class, idOfSomeChildClassInstace);
ofy().load().key(k).now;
Key k=Key.create(someParentClass.generateKey()、SomeChildClass.class、idOfSomeChildClassInstace);
of y().load().key(k).now;

如果我想在不知道父对象的情况下加载SomeChildClass的实例,只需要SomeChildClass的id。

您需要知道整个
键才能
获取()
实体。子键包括:种类、ID和父键。因此,您需要提供所有这三个属性。

您无法做到这一点-实体的实际完整标识符是其每个祖先的种类和id以及它自己的种类和id。这就是为什么构建完整密钥有效,但仅使用子实体id无效的原因。从另一个角度来看,ID仅在同一父级的兄弟姐妹之间是唯一的

解决问题的最简单方法是为子实体生成一个键,然后为其获取“web安全字符串”。此字符串包含实体及其所有父项的所有信息,可用于完全重建完整id

使用objectify:

String websafeKey = Key.create(parentKey, Entity.class, id).getString();
Key<Entity> key = Key.create(websafeKey);
String websafeKey=Key.create(parentKey,Entity.class,id).getString();
Key=Key.create(websafeKey);

如果需要,您也可以使用低级api执行此操作。

“ID仅在同一父级的兄弟姐妹之间是唯一的”哇,我不知道!还有网络安全键,太棒了。谢谢!那么您是说应该将websafeKey存储在子实体的属性中?(因此,您不必通过在API方法中加载父实体来挖掘父ID。)websafe密钥只是密钥的字符串编码,因此没有必要将其存储在它所表示的实体中。这个问题是“如何在不知道家长id的情况下加载孩子”,答案是“这是不可能的”。您可以将子项的id存储在索引属性中并查询它,但这可能是一个设计不足的bandaid。值得注意的是,您永远不必加载实体来创建或使用键-父实体实际上与键父实体不同。键只是坐标-不需要在层次结构中的每个坐标上都存在实体。@Nick感谢您的回答。我遇到的问题是,在获取或插入具有祖父母的实体时,我需要在API方法中使用parentId和祖父母ID。我当时在想,让实体将其websafeKey存储为属性可能更方便。然后,在我的移动应用程序中,当我想存储和实体有一个gradparent时,我可以只传入父对象的websafeKey,而不是传入祖父母ID和父对象ID来生成实体的密钥。我的问题是——这是糟糕的数据库设计,还是有更好的方法来实现这一目标?@Nick我将此转化为一个新问题: