为什么出现以下错误以及如何解决。
传递给selectId实现的实体未定义。您可能应该提供自己的selectId实现。传递的实体:
答案 0 :(得分:1)
可能您正在传递没有id属性的实体。因此,您需要在selectId
创建过程中覆盖EntityAdapter
方法。
export const adapter: EntityAdapter<YourInterface> =
createEntityAdapter<YourInterface>({
selectId: nameofclass => nameofclass.yourID
});
答案 1 :(得分:1)
我通过在EntityMetadataMap中同时为多个实体指定元数据来解决此问题:
// entity-store.module.ts
...
export function selectEventId(event: Event): number {
return event.eventId;
}
export const entityMetadata: EntityMetadataMap = {
User: {},
Event: {
selectId: selectEventId
}
};
...
答案 2 :(得分:1)
此错误通常与丢失-实体主键:
有关每个实体类型必须有一个主键,其值是整数或字符串。 NgRx数据库假定该实体具有“ id”属性,其值为主键。
并非每个实体都具有名为“ id”的主键属性。 对于某些实体,主键可以具有任何名称,也可以是两个或多个属性的组合值。在这些情况下,请始终使用以下功能为该实体指定主键:
此函数返回该实体的指定字段/属性的主键值。
例如:
实体反派没有主键“ id”,但名为“ key”。 对于这个实体, selectId 函数是这样的:
public class GuildMemberLeave extends ListenerAdapter {
public void onGuildMemberLeave(GuildMemberLeaveEvent event) {
EmbedBuilder join = new EmbedBuilder();
TextChannel spamChannel = event.getGuild().getTextChannelById("713429117546135572");
join.setColor(Color.getHSBColor(227, 74, 64));
join.setTitle("SERVER UPDATE");
join.setDescription(event.getMember().getAsMention() + " has now left the server!");
spamChannel.sendMessage(join.build()).queue();
}
实体元数据的完整声明可能类似于:
文件:../ entity-store.module.ts
selectId: (villain: Villain) => villain.key;