私はSaveChangesAsyncを呼び出すときに例外があります。私のアーキテクチャはとてもシンプルですが、私はCategoryクラスを持っています
public class Category {
public Guid ID {get; set;}
public Guid? ParentId {get; set;}
public Category Parent {get; set;}
[...]
}
データベースに新しいカテゴリ(ASP MVCアプリケーションに接続されている)を挿入する場合は、挿入する前にGUIDを設定します。私のデータベースが空で、親カテゴリを挿入したいときにエラーが発生しました(null Guid IdParentとnull Parentを持つため)。親の値を設定すると、これは起こりません。私はVisual StudioによってNullに親を設定することによって手動でレコードを追加することができます。
私は次のエラーがあります:
INSERTステートメントがFOREIGN KEY SAME TABLE制約 "FK_Category_Category_ParentId"と競合しました。競合はデータベース "HT_Root"、テーブル "dbo.Category"、列 "ID"で発生しました。ステートメントは終了されました。
私は単純な答えのためにスタックのオーバーフローで検索し、それを見つけませんでした。私はFluent APIで試してみる:
modelBuilder.Entity<Category>().HasOne(s => s.Parent).WithMany().HasForeignKey(s => s.ParentId);
しかし何も変わっていない。私は間違って何をしていますか?
7 EFで変更されているように見えるこのgithubの問題を参照してください。
試す
public class Category
{
public Guid ID {get; set;}
public Guid? ParentId {get; set;}
public Category Parent {get; set;}
public ICollection<Categories> Children {get; set;}
}
そして
modelBuilder.Entity<Category>()
.HasOne(x => x.Parent)
.WithMany(x => x.Children)
.HasForeignKey(x => x.ParentId)
.Required(false);
また、(指定されていれば)ParentIdがデータベースに存在することを常にチェックする必要があります。この問題が発生する可能性があるため、 null
代わりにGuid.Empty
(00000000-0000-0000-0000-000000000000)を追加してGuid.Empty
。