複数のメールを使用してアカウントを作成できると分かっている、重複しているが巧みなユーザーを削除しようとしています。私のアプリケーションには、ユーザー管理のためのサイトを通してユーザーを追跡するための方法があります。私はFK_constraint
の私はクラスで作成されたので、私は、ユーザーを削除する前に、ユーザが作成したログを削除する必要があります知っている私のManageUsers
コントローラでアイデンティティユーザーを削除するにはどうすればよいですか?
public class UserLog
{
public int Id { get; set; }
public ApplicationUser Customer { get; set; }
public DateTime LogDate { get; set; }
}
:ここに私のユーザ・ログのクラスです。最後に、ユーザーを削除しようとします。これは私が試したものです:
public ActionResult Delete(string UserName)
{
var ocustomerId = User.Identity.GetUserId();
var oCustomer = _context.Users.Single(u => u.Id == ocustomerId).ToString();
//delete user logs
_context.UserLogs
.Where(p => p.Customer.Id == oCustomer)
.ToList()
.ForEach(p => _context.UserLogs.Remove(p));
_context.SaveChanges();
//finally delete from aspnetUsers table
var thisUser =
_context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase));
_context.Users.Remove(thisUser);
_context.SaveChanges(); \\it breaks here
return RedirectToAction("Index");
}
期待どおり、コードの最初の部分は、ユーザーがユーザーによって作成されたログを削除すると予想どおりに動作します。 2番目のcontext.SaveChanges()
にエラーが発生します。
ブレークポイントによって生成されたエラーは次のよう
誤差は、実際のエラーページ上で生成、一方DbUpdateExceptionエラーがEntityFramework.dll
で発生は、次のとおり
DELETE文がREFERENCE制約 "FK_dbo.UserLogs_dbo.AspNetUsers_Customer_Id"と競合しました。競合は、データベース "myDB"、テーブル "dbo.UserLogs"、列 "Customer_Id"の で発生しました。 ステートメントが終了しました。
var ocustomerId = User.Identity.GetUserId(); var oCustomer = _context.Users.Single(u => u.Id == ocustomerId).ToString();
をしかし、その後、あなたは、メソッドのパラメータからユーザー名でユーザーを削除しようとしている。
うまくいった!さらに、私はすでに 'SaveChanges()'を2回呼び出していたアプリケーションで他の場所を削除しました。コードの匂いに加えて、なぜそれが悪いのかを詳しく説明できますか? – Skullomania
それは悪いことではない、時々あなたは本当に1つの関数内で複数回SaveChangesを呼び出す必要があります。 SaveChangesを呼び出すと、キャッシュされたEFオブジェクトを現在のコンテキストからデータベースにコミットします。したがって、あなたの例では2つの問題がありました。 1.コンテキストを最初に選択した後にデータベースからログを削除しようとしましたが(最初のsavechanges呼び出し)、間違ったユーザーを削除しようとしました。メソッドを続行する前に、savechangesを呼び出すと、データベースの作業が終了するか、実際にデータを保存する必要があります。 – DolceVita