2017-08-29 5 views
1

複数のメールを使用してアカウントを作成できると分かっている、重複しているが巧みなユーザーを削除しようとしています。私のアプリケーションには、ユーザー管理のためのサイトを通してユーザーを追跡するための方法があります。私は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(); 

をしかし、その後、あなたは、メソッドのパラメータからユーザー名でユーザーを削除しようとしている。

答えて

1

あなたは現在ログインしているユーザーのログを削除します。 UserNameが現在ログインしているユーザーと同じではないかと思います。

まず、メソッドにユーザーIDを渡します。このIDでユーザーを取得してからエントリを削除します。

 public ActionResult Delete(string UserName) 
    { 
var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 

     var user = userManager.FindByName(UserName); 

     _context.UserLogs 
      .Where(p => p.Customer.Id == user.Id) 
      .ToList() 
      .ForEach(p => _context.UserLogs.Remove(p)); 

     _context.SaveChanges(); 
     userManager.Delete(user); 
     return RedirectToAction("Index"); 
    } 

Btw、SaveChangesを2回呼び出さないでください。

+0

うまくいった!さらに、私はすでに 'SaveChanges()'を2回呼び出していたアプリケーションで他の場所を削除しました。コードの匂いに加えて、なぜそれが悪いのかを詳しく説明できますか? – Skullomania

+0

それは悪いことではない、時々あなたは本当に1つの関数内で複数回SaveChangesを呼び出す必要があります。 SaveChangesを呼び出すと、キャッシュされたEFオブジェクトを現在のコンテキストからデータベースにコミットします。したがって、あなたの例では2つの問題がありました。 1.コンテキストを最初に選択した後にデータベースからログを削除しようとしましたが(最初のsavechanges呼び出し)、間違ったユーザーを削除しようとしました。メソッドを続行する前に、savechangesを呼び出すと、データベースの作業が終了するか、実際にデータを保存する必要があります。 – DolceVita

関連する問題