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

Illegal attempt to establish a relationship 'person' between objects in different contexts

错误发生在以下位置:

@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)")
    }
}()

I'm using 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
        )
    }
}

人物模型

@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"
        )
    }
}

推荐答案

在最新的测试版上也遇到了类似的情况.

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

  • Select 权
  • 提供缺省值

例如:

@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? //<--
}

try 设置:

var person: Person?

在你的Item型车里.

Swift相关问答推荐

";async let和";async之间的差异让我们等待";

将NavigationSplitView更改为NavigationStack

从任务中打印

关闭 SwiftUI TabView 中的子视图

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

应该在ViewModel还是ViewController中使用"Task {}"?

Xcode 15 Beta中如何使用@Observable?

Swift-SceneKit-无法从art.scnassets加载.scn文件

为什么 String.contains 在我导入 Foundation 时表现不同?

XCUITest 在 TearDown 期间随机失败-无法终止 com.bundle.id

在 SwiftUI 中的 ForEach 中使用 id 时如何为数组设置动画索引

Swift Swiftui - 将 colored颜色 保存到 UserDefaults 并从 @AppStorage 使用它

P384 公钥获取IncorrectParameterSize

使用协议捕获 SwiftUI 视图

在 xcode 13 中的构建之间保持可访问性权限

Swift - 如何更新多目录中的对象

Type 应该采用什么协议来让泛型函数将任何数字类型作为 Swift 中的参数?

修复 Swift 3 中的警告C-style for Statement is deprecated

迭代 Firebase 中的子快照

键盘显示时Tableview滚动内容