Nano Hash - криптовалюты, майнинг, программирование

ASP.NET — таблица запросов со строковым идентификатором и двумя ключами

В настоящее время я застрял на фрагменте кода, который возвращает исключение:

КОНТРОЛЛЕР:

 public ActionResult Edit (string userId)
    {
        AspNetUserRoles personRole;
        if (userId == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        ///error happens here during execution of  Find() on table
        personRole = tbls.AspNetUserRoles.Find(userId);


        if (personRole == null)
        {
            return HttpNotFound();
        }
        return View(personRole);
    }

ВИД (через который я передаю идентификатор строки):

@model IEnumerable<WebApplication1.Models.MyViewModel>



<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>

        <th>
            @Html.DisplayNameFor(model => model.Id)
        </th>

        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>

        <th>
            @Html.DisplayNameFor(model => model.RoleId)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>

        <td>
            @Html.DisplayFor(modelItem => item.Id)
        </td>

        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.RoleId)
        </td>
        <td>
            @*I added null, so for the sake of routing*@
            @Html.ActionLink("Edit", "Edit", "Home", new { id = item.Id }, null) |



            @Html.ActionLink("Details", "Details", new { id = item.Id }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.Id })
        </td>
    </tr>
}

</table>

МОДЕЛИ:

  public class MyViewModel
    {

        public string Id { get; set; }
        public string Name { get; set; }
        public string RoleId { get; set; }
    }
 public partial class AspNetUserRoles
    {
        [Key]
        [Column(Order = 0)]
        public string UserId { get; set; }

        [Key]
        [Column(Order = 1)]
        public string RoleId { get; set; }

        public virtual AspNetUsers AspNetUsers { get; set; }
    }
}

public partial class AspNetUsers
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public AspNetUsers()
        {
            AspNetUserRoles = new HashSet<AspNetUserRoles>();
        }

        public string Id { get; set; }

        [StringLength(256)]
        public string Email { get; set; }

        public bool EmailConfirmed { get; set; }

        public string PasswordHash { get; set; }

        public string SecurityStamp { get; set; }

        public string PhoneNumber { get; set; }

        public bool PhoneNumberConfirmed { get; set; }

        public bool TwoFactorEnabled { get; set; }

        public DateTime? LockoutEndDateUtc { get; set; }

        public bool LockoutEnabled { get; set; }

        public int AccessFailedCount { get; set; }

        [Required]
        [StringLength(256)]
        public string UserName { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<AspNetUserRoles> AspNetUserRoles { get; set; }
    }
}

Интересно, что здесь может быть не так. Я могу прокручивать объединенные AspNetUsers и AspNetUserRoles по идентификатору строки, и он дает все записи (набранные для MyViewModel). Затем в представлении я хочу получить доступ к конкретной записи, введенной для AspNetUserRoles, и иметь возможность редактировать ее, хотя сейчас это не имеет значения, поскольку я не могу получить правильную запись при запросе к базе данных.

Я думал, что это либо проблема с маршрутизацией с использованием @Html.ActionLink("Edit", "Edit", "Home", new {id = item.Id}, null) (проверил, как выглядит URI, и это правильное значение контроллера /действие/параметр в порядке, также во время отладки идентификатор строки не был нулевым) или, скорее, проблема с методом Find (), когда он принимает строковый аргумент, или тот факт, что я запрашиваю таблицу, которая имеет 2 ключа (хотя это просто идея, ничего твердый).

Любая зацепка может быть полезной.

Спасибо!


Ответы:


1

Метод Find находит сущности по первичным ключам. Поскольку у вас есть составной первичный ключ в модели AspNetUserRoles, вы должны указать оба ключа, чтобы найти объект:

personRole = tbls.AspNetUserRoles.Find(userId, roleId);

roleId — это идентификатор роли, которую вы хотите найти. Если у вас есть только одна роль, связанная с пользователем, вы можете запросить и получить ее как:

personRole = tbls.AspNetUserRoles.Single(m => m.UserId == userId);

Но имейте в виду, что если у пользователя есть более одной роли, код выше выдаст исключение.

Подробнее о поиске сущностей читайте здесь.

22.08.2016
  • проверю через минуту, спасибо - он рассчитан на одну 1 роль 22.08.2016
  • большое спасибо - это сработало - решение было добавить personRole = tbls.AspNetUserRoles.Single(m => m.UserId == userId); вместо personRole = tbls.AspNetUserRoles.Single(userId); теперь я столкнулся с другой проблемой, но все же мне очень помогло :) 22.08.2016
  • Я рад, что это помогло вам. Попробуйте решить другую проблему самостоятельно. Если вы не можете решить эту проблему после попытки, вы можете снова найти помощь в StackOverflow. 22.08.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..