2017-08-14 11 views
0

私はポストモデルを持ち、タイプAspNetIdentityUserの仮想ICollectionを持っています。ASP.NET - DbUpdateException:DELETEステートメントがREFERENCE制約と競合しました

public class Post{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public virtual ICollection<ApplicationUser> Views { get; set; } 
} 

VIEWSプロパティはカウンタとして機能するだけなので、PostモデルはApplicationUserとの何らかの関係を持つべきではありません。私はではないは、IdentityModelを変更しました。

しかし、コレクションにApplicationUserを追加した後、Postオブジェクトを削除しようとするとDbUpdateExceptionが発生します。

SqlException:DELETEステートメントがREFERENCE制約 "FK_dbo.AspNetUsers_dbo.Posts_Post_Id"と競合しました。競合はデータベース "aspnet-project-test-asp"、テーブル "dbo.AspNetUsers"、列 "Post_Id"で発生しました。

私は、オブジェクトを削除するには、このコードを使用しています:

Post post = db.Posts.Find(id); 
db.Posts.Remove(post); 
db.SaveChanges(); 
return RedirectToAction("Index"); 

答えて

1

あなたはforiegnキーとしてポストIdを持つアプリケーションユーザを持っているためです。投稿を参照しているユーザーを削除してから投稿を削除する必要があります。

Post post = db.Posts.Find(id); 
db.User.RemoveRange(post.Views); 
db.Posts.Remove(post); 
db.SaveChanges(); 
return RedirectToAction("Index"); 

また、あなたはNullにユーザーのPostIdを設定し、ポストを削除する必要があります。私はUserが別のエンティティであり、PostIdへの参照を持っていてはならないと思います。アプリケーションユーザクラスも表示できますか?

また、両方のテーブルのレコードのスクリーンショットを貼り付けることができれば嬉しいです。

DbContextクラスのコンストラクタに以下のコードを追加すると、出力ウィンドウでエンティティフレームワークによって実行された実際のクエリを確認するのに役立ちます。

Database.Log = s => Trace.WriteLine(s); 
+0

ApplicationUserクラスは変更されていません。ユーザーを別のエンティティにし、PostIdへの参照を持たないようにするにはどうすればよいですか? @Manprit Singh Sahota –

関連する問題