繁体   English   中英

从登录用户获取产品时出错。 ASP.NET 核心MVC

[英]Error getting products from the logged in user. ASP.NET Core MVC

我无法仅获取登录用户(即进行购买的用户)购买的产品。

我有一个包含一般注册数据的Users表和一个Customers表。

表之间的关系如下:

  • User :userId、姓名、email、密码
  • Customer :customerId、status、section_id、user_id
  • Product :productId、name、price、purchase_date、customer_id

那么, Products表与Customers表相关,而不是与Users表相关。 而且我无法更改它,因为数据库中还咨询了其他应用程序。

我尝试通过这种方式获取产品,但Customer的 id 值为 null。

public IActionResult View(int id)
{
    User user = _loginUser.GetUser();
    Product product = _pedidoRepository.GetProduct(id);

    if (product.customer_id != user.Customer.customerId)
    {
        return new ContentResult() { Content = "Access denied" };
    }

    return View(product);
}

我得到错误:

Project.Models.users.Customer.get 返回 null

如何使Client ID 可访问以进行比较?

我的GetUser方法如下所示:

public user GetUser()
{
    // Deserializar
    if( _session.Exists(Key)) 
    {
        string user JSONString = _session.Consult(Key);
        return JsonConvert.DeserializeObject<user>(userJSONString);
    }
    else
    {
        return null;
    }
}

重要的是,“用户”和“客户”之间的关系是一一对应的。 注册“用户”时,“客户”在表中注册,“用户”的 fk

Class User.cs

public class User
{
    /* PK */
    [Key]
    public int userId { get; set; }
    public string name { get; set; }
    public string email{ get; set; }
    public string passwor{ get; set; }

    [ForeignKey("user_id")]
    [JsonIgnore]
    public Customer Customer { get; set; }
}

Class Customer.cs

public class Customer
{
    /* PK */
    [Key]
    public int customerId{ get; set; }
    public string Status { get; set; }
   
    [Column("user_id")]
    [ForeignKey("User")]
    public int? user_id { get; set; }
    public virtual User User { get; set; }
    .
    .
}

Class Product.cs

public class Product
{
    /* PK */
    [Key]
    public int productId{ get; set; }
    public string name { get; set; }
    public decimal price { get; set; }
    public DateTime  purchase_date { get; set; }

    [Column("customer_id")]
    [ForeignKey("Customer")]
    public int? customer_id{ get; set; }
    public virtual Customer Customer { get; set; }
}

我感谢任何评论。 我从语言开始。 如果需要,我可以发送更多代码。

好吧,我假设您的 session 拥有用户的 JSON 表示,在某个时候从数据库中查询。 发生这种情况时,将在没有 Customer 导航属性的情况下查询用户(因此它为空)。 当您稍后访问 User.Customer 时,用户实体不再附加到 DbContext,因此不会从数据库加载客户。 如果我的假设是真的,我会提出两个选择:

  1. 填写 session object 时,使用已加载的客户查询用户,如context.Users.Include(c => c.Customer).GetById(x)
  2. 在您的方法中,使用 userId 从数据库查询客户。 即您从 session 获得用户,但从数据库中匹配客户。

选择取决于 Cutomer 是与您的大多数呼叫相关还是仅与单个呼叫相关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM