【发布时间】:2018-02-08 15:11:27
【问题描述】:
我注意到 Breeze.js 在删除尚未持久化的实体 (EntityState = "Added") 和持久化实体之间的任何引用(外键)之间存在令人讨厌的差异。
这可能是与为新实体生成临时密钥有关的问题。在这种情况下,我们为临时键(id)生成负数,并在它们被持久化时替换为实际键。
这将通过一个具体的例子更容易地解释。假设我们有一个名为 Person 的实体,它包含对 Title 实体(“Mr”、“Mrs”等)的引用:
export class Person extends EntityBase {
id: number;
firstName: string;
lastName: string;
titleId: number;
title: Title;
...
}
export class Title extends EntityBase {
id: number;
name: string;
...
}
现在,如果我们在当前上下文中有一个持久的 Title 实体并对其调用 .setDeleted() ,则适用的 Person 实体上的 titleId 属性和标题导航属性都设置为 null。
但是,如果 Title 实体的 EntityState 为“Added”,则只有所有链接的 Person 实体上的标题导航属性设置为 null。 titleId 属性保留其值,导致保存时出错(违反外键约束)。
这意味着删除 EntityState 为“已添加”的 Title 实体需要将所有链接的 Person 实体的 titleId 属性显式设置为 null。
可能值得注意的是,底层数据库中的 TitleID 列可以为空。如果不是,我们当然必须将 titleId 属性设置为合适的值。
必须这样做似乎很笨拙。这种行为是故意的吗?出于某种我无法理解的原因?
【问题讨论】:
标签: breeze