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

C# 从登录用户获取产品时出错。ASP.NET核心MVC,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我在获取登录用户(即进行购买的用户)购买的产品时遇到问题 我有一个Users表,其中包含一般注册数据,还有一个Customers表 各表之间的关系如下所示: 用户:用户名、姓名、电子邮件、密码 客户:客户id、状态、部门id、用户id 产品:产品id、名称、价格、购买日期、客户id 嗯,产品表与客户表相关,而与用户表无关。我不能改变这一点,因为数据库中还有其他应用程序 我尝试以这种方式获取产品,但是Customer的id值为空 public IActionResult View(int id

我在获取登录用户(即进行购买的用户)购买的产品时遇到问题

我有一个
Users
表,其中包含一般注册数据,还有一个
Customers

各表之间的关系如下所示:

  • 用户
    :用户名、姓名、电子邮件、密码
  • 客户
    :客户id、状态、部门id、用户id
  • 产品
    :产品id、名称、价格、购买日期、客户id
嗯,
产品
表与
客户
表相关,而与
用户
表无关。我不能改变这一点,因为数据库中还有其他应用程序

我尝试以这种方式获取产品,但是
Customer
的id值为空

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返回空值

如何使
客户端
id可访问以进行比较

我的
GetUser
方法如下所示:

public user GetUser()
{
    // Deserializar
    if( _session.Exists(Key)) 
    {
        string user JSONString = _session.Consult(Key);
        return JsonConvert.DeserializeObject<user>(userJSONString);
    }
    else
    {
        return null;
    }
}
类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; }
    .
    .
}
类别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; }
}

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

好吧,我假设您的会话包含一个用户的JSON表示,在某个点从数据库查询。发生这种情况时,查询用户时不带Customer Navigation属性(因此为null)。当您访问更高版本的User.Customer时,用户实体不再附加到DbContext,因此不会从DB加载Customer。 如果我的假设是正确的,我会提出两个选择:

  • 填充会话对象时,使用加载的客户查询用户,如
    context.Users.Include(c=>c.customer).GetById(x)
  • 在您的方法中,使用userId从数据库查询客户。即,您从会话中获取用户,但从数据库中获取匹配的客户

  • 选择取决于Cutomer是否与您的大多数通话相关,还是仅与此通话相关。

    [JsonIgnore]
    尝试从用户类的customer属性中删除此选项谢谢您的反馈。我删除了它,但学生的价值仍然为零。谢谢你的评论。就这样!现在我可以得到学生的值,但现在我有一个错误:“为类型为“Project.Models.User”的“User”属性检测到自引用循环”。路径“客户”。我将寻求解决办法。非常感谢。用户引用客户,客户引用用户,所以您有一个循环。您必须明确地告诉EF,这是什么关系:一对一、一对零一等等,哪个是主要实体(即FK应该放在哪个表中)以及删除时要做什么。参见此处示例
    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; }
    }