我有一对多关系SwiftData模型.然而,当我试图追加数据时,会导致错误SwiftData/PersistentModel.swift:540: Fatal error: Unsupported relationship key path ReferenceWritableKeyPath<Student, School>.我应该如何解决这个问题?

@Model
final class School {
  var name: String
  @Relationship(deleteRule: .cascade, inverse: \Student.school)
  var students: [Student] = []

  init(name: String) {
    self.name = name
  }
}

@Model
final class Student {
  var fullName: String
  var school: School

  init(fullName: String, school: School) {
    self.fullName = fullName
    self.school = school
  }
}
struct AddStudentToSchoolView: View {
  let school: School
  @Environment(\.modelContext) private var modelContext

  var body: some View {
    // code ...
    Button("submit". action: { addStudentToSchool() })
  }
  
  private func addStudentToSchool() {
    let student = Student(fullName: "Jenny", school: self.school)
    modelContext.insert(student)
    self.school.students.append(student) // <- error SwiftData/PersistentModel.swift:540: Fatal error: Unsupported relationship key path ReferenceWritableKeyPath<Student, School>
  }
}

如果我注释掉self.school.students.append(student)行,它工作得很好,但即使我删除了一所学校,属于该学校的学生也不会像级联删除一样被删除.我在苹果https://developer.apple.com/forums/thread/736908论坛上发现了类似的问题

推荐答案

您正在将该学生附加到一所学校,即使您已经为该学生分配了一所学校.

let student = Student(fullName: "Jenny", school: self.school)

SwiftData将为您处理关系的另一端,因此将在Student初始化的第self.school = school行为您自动完成students.append(student).

因此,只需删除用于添加学生的函数中的append()代码

private func addStudentToSchool() {
    let student = Student(fullName: "Jenny", school: self.school)
    modelContext.insert(student)
}

Swift相关问答推荐

SwiftUI状态更新

在运行时检测蒸汽工人的类型

不使用`lockFocus`将两个重叠的NSImage转换为单个NSImage

在SwiftUI中使用自定义图像填充列表行的正确方法

如何设置两个不同的视图模型以在我的SwiftUI应用程序中使用相同的数据源?

是否可以循环遍历SWIFT子类并访问它们的静态变量S?

像WebSocket一样接收实时更新,但通过异步/等待或组合

如何才能在同一线程上调用类中的每个方法,而不对每个调用使用同步块?

是否可以将具有关联值的枚举强制转换为其类型与关联值匹配的变量?

不能将符合协议的SWIFT类的实例分配给需要该协议的Objective-C属性

本地对象的异步/等待引用捕获总是安全的还是理论上不安全?

为什么即使 `C` 是一个不是 `Sendable` 的类,Task` 也能工作?

防止带有背景的文本扩展到 maxWidth

在 Swift 的异步上下文中,如何指示我想要函数的同步版本?

如何更新 UserDefault 中的特定值

如何在 ZStack 中单独下移卡片?

Swift中的分段错误

无法使用锚激活约束

'类 'className' 的 NSManagedObject 必须具有有效的 NSEntityDescription.错误

UITableView 布局在 push segue 和 return 上搞砸了. (iOS 8、Xcode beta 5、Swift)