【问题标题】:ASP.NET - Query'ing table with string ID and 2 keysASP.NET - 使用字符串 ID 和 2 个键查询表
【发布时间】:2016-08-22 08:01:58
【问题描述】:

我目前卡在一段返回异常的代码上:

控制器:

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

VIEW(我通过它传递字符串 ID):

@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; }
    }
}

我想知道这里有什么问题。我可以在字符串 ID 上循环访问加入的 AspNetUsers 和 AspNetUserRoles,它会提供所有记录(针对 MyViewModel 键入)。然后在视图中,我希望能够访问针对 AspNetUserRoles 键入的特定记录并能够对其进行编辑,尽管现在这无关紧要,因为我在查询数据库时无法获得正确的记录。

我的想法是使用 @Html.ActionLink("Edit", "Edit", "Home", new { id = item.Id }, null) 的路由问题(检查了 URI 的样子,它是正确的意思控制器/动作/参数是好的,在调试字符串 Id 不为空时也是如此)或者更确切地说是 Find() 方法的问题,而它需要字符串参数或者我正在查询具有 2 个键的表的事实(尽管它只是一个不可靠的想法)。

任何线索都可能有用。

谢谢!

【问题讨论】:

    标签: c# mysql asp.net-mvc foreign-keys key


    【解决方案1】:

    Find 方法使用主键查找实体。由于您在AspNetUserRoles 模型上有复合主键,因此您必须提供两个键才能找到实体:

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

    roleId 是您要查找的角色的 id。如果您只有一个角色与用户关联,那么您可以查询并获取它:

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

    但请记住,如果用户拥有多个角色,上述代码将引发异常。

    阅读更多关于查找实体here

    【讨论】:

    • 稍后会检查,谢谢 - 它旨在具有一个 1 角色
    • 非常感谢 - 它有效 - 解决方案是添加 personRole = tbls.AspNetUserRoles.Single(m => m.UserId == userId);而不是 personRole = tbls.AspNetUserRoles.Single(userId);现在我面临另一个问题,但仍然对我帮助很大:)
    • 很高兴它对您有所帮助。尝试自己解决另一个问题。如果尝试后无法解决,可以在 StackOverflow 中再次寻求帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多