SwiftData关联报错‘Inverse Relationship does not exist’如何解决?
SwiftData 一对多关联关系修正方案
你的代码核心问题是关联关系的反向指向完全错误:你把普通数据属性(比如CrewModel.name、Flight.flightID)当成了关联属性来设置反向关系,这违反了SwiftData关联的双向绑定规则,导致系统找不到对应的反向关联,触发Fatal error: Inverse Relationship does not exist。
正确的一对多关联逻辑应该是:
- 一个
Flight包含多个CrewModel(一对多) - 每个
CrewModel属于一个Flight(多对一)
以下是修正后的完整代码:
修正后的Flight类
@Model class Flight { @Attribute(.unique) var flightID: UUID var typeOfFlight: String var flightDateUTC : Date var flightNumber: String? @Relationship(.cascade) var flightData: FlightData @Relationship(.cascade) var flightTime : FlightTime @Relationship(.noAction) var aircraft : Aircraft? // 关联到CrewModel的flight属性,删除Flight时可选.cascade(级联删除 crew)或.noAction(保留 crew) @Relationship(.noAction, inverse: \CrewModel.flight) var crews: [CrewModel]? init(flightID: UUID, typeOfFlight: String, flightDateUTC: Date, flightNumber: String? = nil, flightData: FlightData, flightTime: FlightTime, aircraft: Aircraft? = nil, crews: [CrewModel]? = nil) { self.flightID = flightID self.typeOfFlight = typeOfFlight self.flightDateUTC = flightDateUTC self.flightNumber = flightNumber self.flightData = flightData self.flightTime = flightTime self.aircraft = aircraft self.crews = crews } }
修正后的CrewModel类
@Model class CrewModel { @Attribute(.unique) var id: UUID = UUID() var name: String? // 恢复为普通属性,不再标记为@Relationship var crewID: String? var company: String? var isMe: Int? var email: String? var phone: String? var score: Int? var isPIC: Int? var isSIC: Int? var dataImage: Data? var comment: String? // 添加反向关联属性:每个Crew属于一个Flight @Relationship(.noAction, inverse: \Flight.crews) var flight: Flight? init(id: UUID, name: String? = nil, crewID: String? = nil, company: String? = nil, isMe: Int? = nil, email: String? = nil, phone: String? = nil, score: Int? = nil, isPIC: Int? = nil, isSIC: Int? = nil, dataImage: Data? = nil, comment: String? = nil) { self.id = id self.name = name self.crewID = crewID self.company = company self.isMe = isMe self.email = email self.phone = phone self.score = score self.isPIC = isPIC self.isSIC = isSIC self.dataImage = dataImage self.comment = comment } }
关键修正点说明:
- 移除错误的关联标记:把
CrewModel.name上的@Relationship去掉,它只是普通的字符串属性,不是关联对象。 - 添加正确的反向关联属性:在
CrewModel中新增var flight: Flight?属性,用@Relationship标记并指向Flight.crews,完成双向绑定。 - 修正Flight的关联指向:
Flight.crews的inverse改为\CrewModel.flight,和反向属性对应。 - 调整删除规则:根据业务需求选择删除规则,比如
Flight删除时,若希望同时删除关联的CrewModel,可以把@Relationship的规则设为.cascade;若希望保留CrewModel,则用.noAction。
内容的提问来源于stack exchange,提问作者Damiano Miazzi
相关产品推荐
相关产品推荐

