モデルPersonとモデルチームがあります。チームには、Person.PersonIdへのnull可能なTeamleaderIdと仮想のPersonleader {get; set;}を持つFKからPersonへのFKがあります。FK更新時の参照整合性制約違反
いくつかのチームがあり、チームリーダーを持つものもあれば、そうでないものもあります。今では、チームリーダーのプロパティを別のチームリーダーに変更しようとしています。 SaveChangesでは、次の例外が発生します。「参照整合性制約違反が発生しました:リレーションシップの一端の 'Personal.PersonalId'のプロパティ値が 'Team.TeamleaderId'のプロパティ値と一致しませんもう一方の端。
チームリーダーとチームリーダーIDが対応しているため、チームリーダーをヌルにリセットしても機能しません。
リーダーを持たないチームにチームリーダーを初めて設定すると、すべてが機能します。チームリーダーの変更はもはや機能しません。
私は間違っていますか?
public class Person
{
[Key]
public long PersonId { get; set; }
// some other...
// optional: List of Teams
}
public class Team
{
[Key]
public long TeamId { get; set; }
// some other...
public long? TeamleaderId { get; set; }
[ForeignKey("TeamleaderId")]
public virtual Person Teamleader { get; set; }
}
私はまだいくつかの研究をやっているし、戻ってくる...
うわー:ここ
モデルは以下のとおりです。
敬具、
EDITメイト!そして、非常に奇妙なもののために:
私はウォッチウィンドウ内のエンティティ状態を照会すると、状態は "Modified"であり、レコードは正しく保存されます。エンティティ状態を照会しないと、レコードがSaveChangesに来ると状態は "Unchanged"になり、何も起こりません。この時点でAutoDetectChangesEnabledはtrueです。
これは何ですか?
あなたは 'TeamLeader'プロパティまたは' TeamLeaderId'プロパティを変更していますか?また、サンプルモデルと問題を再現するコード([mcve])を投稿すると良いでしょう –
ChangeTrackingを有効にしていますか?取得時にチームリーダーを読み込みますか?エンティティ状態が正しく設定されているか、データベース内のIDですか? – DevilSuichiro
TeamLeaderIdプロパティを変更します。ナビゲーションプロパティはnullに設定されています。 AutoDetectChangesは、パフォーマンスが悪かったため、falseに変更しました。しかし、これは解決策につながるようです。 AutoDetectChangesをfalseに設定すると、ほとんどの場合動作します。しかし、この特別な場合、私たちは困ってしまう。私はさらなる情報を持って戻ってきます... – Mate