2017-01-30 4 views
0

В этом ActionResult Я удаляю пользователей из моей таблицы ASP.NET Users.Как удалить идентификатор пользователя asp.net, когда ограничения были помещены в таблицу?

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"); 
} 

Однако при попытке удалить пользователь, я получаю следующее сообщение об ошибке:

В ВЕЯТ конфликтное с ссылочным ограничением «FK_dbo.UserLogs_dbo.AspNetUsers_Customer_Id». Конфликт произошел в базе данных «MYDATABASE», таблице «dbo.UserLogs», в столбце «Customer_Id». Заявление было прекращено.

Я знаю, что ограничения помечены там, чтобы предотвратить повреждение данных, и это нормально, но как бы я мог устранить ограничения, достаточные для меня, чтобы удалить пользователя, а затем добавить их обратно после удаления пользователя?

+2

'как бы я хотел бы устранить ограничения, достаточные для того, чтобы удалить пользователя, а затем добавить их обратно после удаления пользователя? Если вам это не нужно, то почему у него это в первую очередь? Удалите ограничение внешнего ключа из таблицы. Его конфликт по какой-то причине. 'Перед удалением из пользователя вам нужно удалить запись из другой таблицы. Я понимаю, что вам нужно это как журнал? то почему вам нужно ограничение внешнего ключа? – TheUknown

+0

@TheUknown, используя код-сначала, ограничения создаются автоматически в любое время, когда я хочу ссылаться на «ApplicationUser» в другой таблице. Но я не хочу удалять журналы пользователя или пользовательские заказы. Это очень плохо для управления рисками и отчетности. – Skullomania

+0

С использованием кода сначала вы пишете код и определяете ограничение - как они могут быть созданы автоматически? в БД сначала это было бы. – TheUknown

ответ

1

Короче говоря, вы в беде. Но есть способы исправить это.

Вы не хотите связываться с внешними ключами только для того, чтобы удалить пользователя, но ограничения существуют по уважительной причине. И вы хотите удалить записи пользователя.

Давайте посмотрим на сценарий - пользователь регистрируется, что-то на вашем сайте генерирует несколько записей журнала с идентификатором пользователя, ссылающимся на пользователя. Затем пользователь решает, что он больше не любит вашу систему и удаляет свой профиль. Если вы удалите ограничение FK, затем удалите запись из таблицы Users, а затем восстановите ограничение, вы получите записи в таблице журналов, содержащей UserId. Но через 2 месяца после того, как вы хотите найти этого пользователя, вы обнаружите, что идентификатор не указывает нигде. Это делает журналы довольно бесполезными.

Так что ваши варианты:

  • Soft Delete - на самом деле не удалять записи пользователей, но установить флаг, что они были удалены, и убедитесь, что все системы, которые обращаются к таблице пользователей знают об этом флаге и игнорировать записи с мягким удалением.
  • Денормализовать информацию пользователя в журналы. У вас нет ограничений FK в журналах от пользователей, но сохраняйте в logs userId, имя пользователя, возможно, электронную почту. Таким образом, вы все равно будете знать, что сделал пользователь, и вы сможете отслеживать действия удаленных пользователей. И вам не нужно возиться с FK, когда вы пытаетесь удалить пользователя. Это то, что я делаю в своих системах, но я не вхожу в БД, а в другое хранилище, где FKs для 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

Смежные вопросы