SwiftData:非法尝试在不同上下文中的对象之间建立关系

Tra*_* M. 1 swift swift-data

我有 2 个漂亮的模型,想为它们创建一些虚拟预览数据,但我遇到了错误:

非法尝试在不同上下文中的对象之间建立“人”关系

错误发生在这里:

@MainActor
let previewContainer: ModelContainer = {
    do {
        let container = try ModelContainer(
            for: Person.self, Item.self,
            configurations: ModelConfiguration(isStoredInMemoryOnly: true)
        )
        let person = Person.dummy()
        container.mainContext.insert(person)
        for i in 0 ..< 12 {
            let item = Item.dummy(i, person: person) //ERROR!
            container.mainContext.insert(item)
        }
        return container
    } catch {
        fatalError("Failed to create container \(error)")
    }
}()
Run Code Online (Sandbox Code Playgroud)

我正在使用 Xcode 15 beta 8。知道我做错了什么吗?

以下是我的模型供参考:

项目型号

@Model
final class Item {
    var note: String
    var person: Person

    init(note: String, person: Person) {
        self.note = note
        self.person = person
    }
    
    static func dummy(_ index: Int, person: Person) -> Item {
        return Item(
            note: "Item number \(index)",
            person: person
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

人物模型

@Model
final class Person {
    var name: String
    @Relationship(
        deleteRule: .cascade, 
        inverse: \Item.person
    )
    var items: [Item] = []
    
    init(name: String, items: [Item] = []) {
        self.name = name
        self.items = [Item]
    }
    
    static func dummy() -> Person {
        return Person(
            name: "John Doe"
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

Wil*_* T. 7

在最新的测试版中遇到了类似的情况。

WWDC 视频没有明确提及这一点,但查看他们的数据模型,似乎所有@Relationship字段都需要是:

  • 选修的
  • 提供默认值

例如:

@Model
final class Trip {
    var destination: String?
    var end_date: Date?
    var name: String?
    var start_date: Date?
  
    @Relationship(.cascade)
    var bucketListItem: [BucketListItem] = [BucketListItem]() //<--
  
    @Relationship(.cascade)
    var livingAccommodation: LivingAccommodation? //<--
}
Run Code Online (Sandbox Code Playgroud)

尝试设置:

var person: Person?
Run Code Online (Sandbox Code Playgroud)

在您的项目模型中。