【发布时间】:2020-01-29 16:50:07
【问题描述】:
我以前遇到过这个问题。我只是不记得是什么导致了它。我也在尝试使用 AspNetUsers 和 AspNetRoles 表来实现这一点。我不确定这是否是问题的一部分。
这是我的模型:
public class MenuPermission
{
[Key]
public string Id { get; set; }
public string MenuId { get; set; }
public virtual Menu Menu_MenuId { get; set; }
public string RoleId { get; set; }
public virtual RoleDTO Role_RoleId { get; set; }
public string UserId { get; set; }
public virtual ExpandedUserDTO User_UserId { get; set; }
public int? SortOrder { get; set; }
public bool IsForNavBar { get; set; }
public bool IsCreate { get; set; }
public bool IsRead { get; set; }
public bool IsUpdate { get; set; }
public bool IsDelete { get; set; }
}
这是 SQL Server 中的外键:
ALTER TABLE [dbo].[MenuPermission] WITH CHECK
ADD CONSTRAINT [FK_dbo.MenuPermission_dbo.AspNetRoles_RoleId]
FOREIGN KEY([RoleId]) REFERENCES [dbo].[AspNetRoles] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[MenuPermission] CHECK CONSTRAINT [FK_dbo.MenuPermission_dbo.AspNetRoles_RoleId]
GO
ALTER TABLE [dbo].[MenuPermission] WITH CHECK
ADD CONSTRAINT [FK_dbo.MenuPermission_dbo.AspNetUsers_UserId]
FOREIGN KEY([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id])
GO
ALTER TABLE [dbo].[MenuPermission] CHECK CONSTRAINT [FK_dbo.MenuPermission_dbo.AspNetUsers_UserId]
我运行项目时遇到的错误是:
SqlException:列名“Role_RoleId_Id”无效。
列名“User_UserId_UserName”无效。
这是导致问题的代码行:
var global = HttpRuntime.Cache.Get(cacheItemKey);
if (global == null)
{
LINE OF ERROR --> global = db.MenuPermissions.Where(i => i.RoleId == RoleId || i.UserId == userId).ToArray();
HttpRuntime.Cache.Insert(cacheItemKey, global, null, DateTime.Now.AddMinutes(2), System.Web.Caching.Cache.NoSlidingExpiration);
}
编辑:这是源于的代码:
public ActionResult GetGrid()
{
var tak = db.MenuPermissions.ToArray();
var result = from c in tak
select new string[] { c.Id.ToString(), Convert.ToString(c.Id),
Convert.ToString(c.Menu_MenuId !=null?c.Menu_MenuId.MenuText:""),
Convert.ToString(c.Role_RoleId.RoleName),
Convert.ToString(c.User_UserId !=null?c.User_UserId.UserName:""),
Convert.ToString(c.SortOrder),
Convert.ToString(c.IsForNavBar),
Convert.ToString(c.IsAdd),
Convert.ToString(c.IsCreate),
Convert.ToString(c.IsRead),
Convert.ToString(c.IsUpdate),
Convert.ToString(c.IsDelete),
};
return Json(new { aaData = result }, JsonRequestBehavior.AllowGet);
}
编辑:用户和角色视图模型
public class RoleDTO
{
[Key]
public string Id { get; set; }
[Display(Name = "Role Name")]
public string RoleName { get; set; }
}
public class ExpandedUserDTO
{
[Key]
[Display(Name = "User Name")]
[Required(ErrorMessage = "Please enter User Name")]
public string UserName { get; set; }
[Display(Name = "User Id")]
public string UserId { get; set; }
[Display(Name = "Email address")]
[Required(ErrorMessage = "The Email address is required")]
[EmailAddress(ErrorMessage = "Invalid Email Address")]
public string Email { get; set; }
[StringLength(255, MinimumLength = 8)]
[Required(ErrorMessage = "The Password is required")]
public string Password { get; set; }
[Display(Name = "Lockout End Date UTC")]
public DateTime? LockoutEndDateUtc { get; set; }
public int AccessFailedCount { get; set; }
public string PhoneNumber { get; set; }
public string CompanyName { get; set; }
public IEnumerable<UserRolesDTO> Roles { get; set; }
[Required(ErrorMessage = "The Roles is required")]
public string Role { get; set; }
}
更新: 我添加了一个只有 Id 和用户名的新 ViewModel UsersDTO。 ID 是密钥。我在用户端不再有错误。
角色仍然有问题...
更新:
这是目前正在运行的:
添加了 UserDTO
public virtual UserDTO User_UserId { get; set; }
型号:
public class UserDTO
{
[Key]
[Display(Name = "User Id")]
public string UserId { get; set; }
[Display(Name = "User Name")]
public string UserName { get; set; }
}
将外键添加到:
[ForeignKey("RoleId")]
public virtual RoleDTO Role_RoleId { get; set; }
【问题讨论】:
-
您能否也发布您的用户和角色模型类 - 至少突出显示各个类的主键的部分?
-
我拥有的唯一模型是这些的 ViewModel。当您选择使用多个用户时,实体框架会创建这些。我正在使用为角色创建的视图模型。那就是我的出发点。我会发布的。
-
我想可以为 AspNetUsers 和 AspNetRoles 创建模型,但我认为这违背了 Identity Grain...不是吗?
-
对于用户列错误,很明显UserName是模型中的Key,而UserId在数据库中定义为FK
-
我在发布它时确实注意到了这一点。但是角色也有类似的问题。这已将 Id 定义为键。
标签: c# sql-server asp.net-mvc