【问题标题】:Invalid column names when using foreign keys使用外键时列名无效
【发布时间】: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


【解决方案1】:

请装修房子

public virtual RoleDTO Role_RoleId { get; set; } 

[ForeignKey("RoleId ")]属性

public class MenuPermission
{
    [Key]
    public string Id { get; set; }
    // Other properties go here
    public string RoleId { get; set; }
    [ForeignKey("RoleId ")] 
    public virtual RoleDTO Role_RoleId { get; set; }

    public string UserId { get; set; }
    public virtual ExpandedUserDTO User_UserId { get; set; } // this seems to be configuration issue. Database says UserId is issue but ExpandedUserDTO says UserName is key.
    // Other properties go here
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多