Please help me figure out an issue with setting up edges in Entgo. I have two schemas: LinkServiceDelivery and BridgeVersion.
- BridgeVersion is the main table.
- LinkServiceDelivery is a reference.
These tables are connected through the code_delivery_rk column as a One-to-Many (O2M) relationship. This means one version_rk from the BridgeVersion table can correspond to several service_rk from the LinkServiceDelivery table. It is necessary to connect via code_delivery_rk. That is, when requesting with WithLinkDelivery(), the selection was made by code_delivery_rk.
I am trying to set up the relationship using edges, but I constantly get the following error:
has a field "code_delivery_rk" but it is not holding a foreign key
I tried many variations, reviewed many examples, but could not apply the described patterns to my case.
BridgeVersion
package schemas
import (
"entgo.io/ent"
"entgo.io/ent/dialect"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)
type BridgeVersion struct {
ent.Schema
}
func (BridgeVersion) Fields() []ent.Field {
return []ent.Field{
field.Int("id").SchemaType(map[string]string{
dialect.Postgres: "bigserial",
}).StorageKey("version_rk"),
field.Int("code_delivery_rk"),
field.Int("release_major_num"),
field.Int("release_minor_num"),
field.Int("release_fix_num"),
field.Text("release_desc"),
field.Time("release_build_dttm").SchemaType(map[string]string{
dialect.Postgres: "timestamp with time zone",
}),
field.Time("release_delivery_dttm").SchemaType(map[string]string{
dialect.Postgres: "timestamp with time zone",
}),
}
}
func (BridgeVersion) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Annotation{Table: "bridge_version", Schema: "metamodel"},
}
}
func (BridgeVersion) Edges() []ent.Edge {
return []ent.Edge{
edge.To("bridge_flow", BridgeFlow.Type),
edge.From("dict_code_delivery", DictCodeDelivery.Type).Ref("bridge_version").Field("code_delivery_rk").Required().Unique(),
edge.From("link_service_delivery", LinkServiceDelivery.Type).Ref("bridge_version").Field("code_delivery_rk"),
//edge.To("bridge_service", BridgeService.Type).Through("link_service_delivery", LinkServiceDelivery.Type).Field("code_delivery_rk"),
//edge.To("link_service_delivery", LinkServiceDelivery.Type).,
//edge.To("group", BridgeVersion.Type),
edge.To("flow_version_delivery", FlowVersionDelivery.Type).StorageKey(edge.Column("version_rk")),
}
}
LinkServiceDelivery
package schemas
import (
"entgo.io/ent"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)
type LinkServiceDelivery struct {
ent.Schema
}
func (LinkServiceDelivery) Fields() []ent.Field {
return []ent.Field{
field.Int("id").StorageKey("service_rk"),
field.Int("code_delivery_rk").StorageKey("code_delivery_rk"),
field.Bool("is_ddl_flg"),
field.Bool("is_flow_flg"),
field.Bool("is_config_flg"),
}
}
func (LinkServiceDelivery) Edges() []ent.Edge {
return []ent.Edge{
//edge.From("bridge_flow", BridgeFlow.Type).Ref("service").Through("t2", BridgeVersion.Type),
//edge.To("bridge_service", BridgeService.Type).Unique().Required().Field("service_rk"),
edge.To("bridge_version", BridgeVersion.Type).Field("code_delivery_rk"),
}
}
func (LinkServiceDelivery) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Annotation{Table: "link_service_delivery", Schema: "metric"},
}
}
Now I have made a view, and made a classic relation through version_rk, this generally solved the problem, but I do not consider this the correct option. I'm new to entgo, please help me resolve this issue