You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    }
}

关键修正点说明:

  1. 移除错误的关联标记:把CrewModel.name上的@Relationship去掉,它只是普通的字符串属性,不是关联对象。
  2. 添加正确的反向关联属性:在CrewModel中新增var flight: Flight?属性,用@Relationship标记并指向Flight.crews,完成双向绑定。
  3. 修正Flight的关联指向:Flight.crews的inverse改为\CrewModel.flight,和反向属性对应。
  4. 调整删除规则:根据业务需求选择删除规则,比如Flight删除时,若希望同时删除关联的CrewModel,可以把@Relationship的规则设为.cascade;若希望保留CrewModel,则用.noAction。

内容的提问来源于stack exchange,提问作者Damiano Miazzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:02:33