В настоящее время я застрял на фрагменте кода, который возвращает исключение:
КОНТРОЛЛЕР:
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 ключа (хотя это просто идея, ничего твердый).
Любая зацепка может быть полезной.
Спасибо!