Неверные имена столбцов при использовании внешних ключей - PullRequest
0 голосов
/ 29 января 2020

Я сталкивался с этой проблемой раньше. Я просто не могу вспомнить, что это было причиной. Я также пытаюсь реализовать это с помощью таблиц 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 Сервер:

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

ОБНОВЛЕНИЕ: Я добавил новый ViewModel UsersDTO только с идентификатором и именем пользователя. Идентификатор является ключевым. У меня больше нет ошибки на стороне пользователя.

По-прежнему возникают проблемы с ролями ...

ОБНОВЛЕНИЕ:

Вот что сейчас работает:

Добавлено 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; }

1 Ответ

0 голосов
/ 29 января 2020

Пожалуйста, украсьте собственность

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
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...