2017-01-30 2 views
0

このActionResultでは、ASP.NETユーザーテーブルからユーザーを削除しています。 REFERENCE制約「FK_dbo.UserLogs_dbo.AspNetUsers_Customer_Id」と競合テーブルに制約が設定されている場合、asp.net IDユーザーを削除するにはどうすればよいですか?

DELETE文:

public ActionResult Delete(string UserName) 
{ 
    var thisUser = 
    _context.Users.FirstOrDefault(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)); 
    _context.Users.Remove(thisUser); 
    _context.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

は、しかし、私は、私は次のエラーを取得するユーザーを削除しようとします。競合は、データベース "MYDATABASE"、テーブル "dbo.UserLogs"、列 'Customer_Id'で発生しました。 ステートメントが終了しました。

データの破損を防ぐために制約が置かれていることは知っていますが、これは問題ありませんが、ユーザーを削除してからユーザーを削除した後に追加するにはどうすれば制約を削除できますか?

+2

「ユーザーを削除してからユーザーを削除した後に追加するにはどうすればよいでしょうか?」というメッセージが表示されます。テーブルから外部キー制約を削除します。それは理由のために矛盾している。 'ユーザーから削除する前に、他のテーブルからエントリを削除する必要があります。あなたはログとして必要なことを理解していますか?なぜ外部キーの制約が必要ですか? – TheUknown

+0

@TheUknownはコードを使用しています。最初の制約は、別の表の 'ApplicationUser'を参照したいときはいつでも自動的に作成されます。しかし、私はユーザーのログやユーザーの注文を削除したくない。それはリスク管理とアカウンタビリティのために非常に悪いです。 – Skullomania

+0

コードを使用して、まずコードを書いて制約を定義します。どのようにして自動的に作成できますか? DBで最初に、それはそうです。 – TheUknown

答えて

1

を参照してください、あなたが困っています。しかし、それを修正する方法があります。

ユーザーを削除するだけで外来キーを混乱させるのではなく、正当な理由で制約があります。また、ユーザーレコードを削除する必要があります。

シナリオ - ユーザレジスタを見てみましょう。あなたのサイトで、ユーザIDを参照していくつかのログレコードを生成してユーザに戻します。ユーザーは自分のシステムが好きではないと判断し、プロフィールを削除します。 FK制約を削除してからUsersテーブルからレコードを削除し、制約を復元すると、UserIdを含むLogsテーブルのレコードが取得されます。しかし、2ヵ月後にそのユーザーを調べたい行を探してください。あなたはそのIDがどこにも向いていないことがわかります。そうすればログは無駄になります。

だからあなたのオプションは次のとおりです。

  • ソフトの削除 - 実際にユーザレコードを削除し、彼らが削除されたフラグを設定し、ユーザーテーブルにアクセスするすべてのシステムは、このフラグについて知っていることを確認していませんソフト削除されたレコードは無視します。
  • ユーザー情報をログに非正規化します。ユーザーからのログにはFK制約はありませんが、ログuserId、ユーザー名、場合によっては電子メールのままにしておきます。こうすることで、ユーザーが何をしたのかが分かり、削除されたユーザーの操作を追跡できます。そして、あなたはユーザーを削除しようとするときにFKを使いこなす必要はありません。これは私のシステムでやっていることですが、私はDBにログインするのではなく、FKからSQLまで不可能な他のストレージにログインしています。
1

あなたは一時的にエラーを回避するために、テーブルのすべての制約を無効にして、以下のように戻ってそれを有効にすることができます。

ALTER TABLE <table_name> NOCHECK CONSTRAINT ALL 
--Run query here 
ALTER TABLE <table_name> CHECK CONSTRAINT ALL 

は要するにmore info

+0

これはSQLで動作しますが、asp.net MVC5 C#とlinq – Skullomania

+0

@Skullomaniaが使用されていますその下にあるSQLデータベースで、データを格納します。 – trailmax

関連する問題