当我尝试将新的子关系添加到现有父对象时,实体会尝试将父对象插入为new,而不是将其更新为modified。我收到一条错误消息,说它试图插入重复的密钥。
这真的难倒我,直到我用新关系更新模型(通过从数据库更新,而不是先代码),它才表现得像这样。相同上下文中的其他表,具有相同的多对多模式不会导致此错误!
我发现如果我将我的子对象添加到上下文中,仔细设置 ID 值,而不是导航属性,它会保存得很好。但是修复过程不会将子对象添加到导航集合中,这会导致其他地方出现逻辑问题。
我的模型有这样的多对多关系:
option -< optionUnit >- 单位
Option 和 Unit 对象都存在并加载到上下文中。
通常我会制作桥接表并设置如下导航属性:
bridge = new OptionUnit()
{
OptionUnitId = Guid.NewGuid(),
Unit = SelectedUnit,
Option = SelectedOption,
};
//Context.OptionUnits.Add(bridge); //added to context via the navigation properties
但是当我这样做时,实体试图将 SelectedOption 插入为新的(即使它的实体状态在保存时被修改,而不是新的或分离的)。
为了解决这个问题,我不得不制作桥并设置唯一的 ID。保存时我没有收到错误,但它不会像我期望的那样通过修复自动添加到 SelectedOption.OptionUnits 中。如果我手动将它添加到集合中,我会再次收到保存错误。
bridge = new OptionUnit()
{
OptionUnitId = Guid.NewGuid(),
//Unit = SelectedUnit,
UnitId = SelectedUnit.UnitId,
//Option = SelectedOption,
OptionId = SelectedOption.OptionId,
};
Context.OptionUnits.Add(bridge);
这似乎只发生在选项实体上的关系上。optionUnit >- Unit 之间的其他关系没有问题并且按预期工作。
似乎关系有问题,但我不确定在哪里看。我需要知道是什么导致了这种行为,如何解决它,以及如何防止它在未来发生......