Проблема внешнего ключа в ASP.NET MVC с использованием C # при попытке удалить запись в базе данных - PullRequest
1 голос
/ 04 октября 2019

Я новичок в ASP.NET MVC и вообще в C #, может быть, вы можете мне помочь.

У меня есть соединение с моей базой данных, и у меня уже есть контроллер таблицы SEC_Users. Моя проблема в том, что в нашей базе данных много таблиц с большим количеством внешних ключей. Таким образом, наши пользователи подключены ко многим другим таблицам (для меня это всего лишь обходной путь проекта).

Теперь у меня проблема, что я не могу удалить пользователя, потому что он подключен к другим таблицам иМне нужно сначала удалить эти записи. Я начал удалять одну за другой таблицу. Но сейчас я застрял.

У пользователя есть несколько записей в таблице SEC_LoginToken, которые мне нужно удалить. Это работает, но мне также нужно удалить запись в таблице SEC_RefreshToken, которая связана с SEC_LoginToken через столбец token. И я не знаю, как я могу удалить эти записи в таблице SEC_RefreshToken.

Извините за мой английский, надеюсь, вы понимаете мою проблему.

Так что для удаления всех записей вВ других таблицах я беру идентификатор у пользователя и проверяю, есть ли запись с этим идентификатором пользователя, и если да, я ее удаляю. Я попытался взять столбец token из SEC_LoginToken, где я хочу удалить строки и сохранить их в списке. И затем я хочу сказать, что для каждой записи в списке следует удалить строку в SEC_RefreshToken, где столбец token одинаков. Но это не работает. Может быть, есть лучший способ? Или что я делаю не так?

Здесь вы видите УДАЛИТЬ (функцию?) Моего контроллера:

[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    // Löschen aller Einträge des Users in der DAT_UserDetail
    foreach (var ec in db.DAT_UserDetail.Where(x => x.UserID == id))
        db.DAT_UserDetail.Remove(ec);

    // Löschen aller Einträge des Users in der SEC_ObjectAccessRight
    foreach (var ec in db.SEC_ObjectAccessRight.Where(x => x.UserID == id))
        db.SEC_ObjectAccessRight.Remove(ec);

    // Löschen aller Einträge des Users in der SEC_UserGroupFunction_User
    foreach (var ec in db.SEC_UserGroupFunction_User.Where(x => x.UserID == id))
        db.SEC_UserGroupFunction_User.Remove(ec);

    //-----------------------------------------------------------------------
    List<string> token = new List<string>();

    foreach (char ec in db.SEC_LoginToken.Where(x => x.UserID == id)
        .Select(x => x.Token)
        .Single())
        token.Add(ec.ToString());

    foreach (string row in token)
    {
        // db.SEC_RefreshToken.Remove(token);
        db.SEC_RefreshToken.RemoveRange(db.SEC_RefreshToken.Where(x => x.Token == row));
        db.SaveChanges();
    }

    //-----------------------------------------------------------------------

    // Löschen aller Einträge des Users in der SEC_LoginToken
    foreach (var ec in db.SEC_LoginToken.Where(x => x.UserID == id))
        db.SEC_LoginToken.Remove(ec);

    // Löschen des Users
    SEC_User sEC_User = db.SEC_User.Find(id);
    db.SEC_User.Remove(sEC_User);

    db.SaveChanges();

    return RedirectToAction("Index");
}

Я просто хочу нажать кнопку удаления без получения ошибки: последовательностьсодержит более одного элемента. Это происходит там, где я кодировал

foreach (char ec in db.SEC_LoginToken.Where(x => x.UserID == id).Select(x => x.Token).Single())

Заранее большое спасибо!

1 Ответ

2 голосов
/ 04 октября 2019

Ошибка ' в последовательности содержит более одного элемента ' возникает из-за того, что

db.SEC_LoginToken.Where(x => x.UserID == id).Select(x => x.Token).Single()

возвращает более одного элемента. В этом случае это означает, что для x.UserID == id существует Collection из SEC_LoginToken. Вы должны изменить его на:

foreach (string ec in db.SEC_LoginToken.Where(x => x.UserID == id)
            .Select(x => x.Token)
            .ToList())

В другом примечании, вы рассматривали возможность использования логического / мягкого удаления? Это решило бы все ваши проблемы каскадного удаления, и у вас была бы история для аудита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...