【问题标题】:Some data from foreign key automatically loaded even though I didn't include that即使我没有包含外键的一些数据也会自动加载
【发布时间】:2019-07-08 11:11:13
【问题描述】:

我正在制作关于让 2 人或更多人可以互相预约的项目。一切正常,但我只是意识到,即使我没有将外键中的一些数据包含在代码中,它也会自动加载。

这是我制作的 API 的结果

{
    "uId": 1,
    "userId": "xxxx",
    "receiveAppointmentForms": [],
    "requestAppointmentForms": [
        {
            ...Some infomation,
            "receiveUser": {
                "uId": 2,
                "userId": "zzz",
                "receiveAppointmentForms": [],
                "requestAppointmentForms": null,
                "topThrees": null,
                "userRole": null,
                "coach": null,
                "department": null,
                "position": null
            },
            "record": null
        }
    ],
    "userRole": null,
    "coach": null,
    "department": null,
    "position": null
},

所以我确实包含了“requestAppointmentForms”字段,但我不想显示“receiveUser”,它是指用户表的外键。 因为我没有在我的网页上使用该信息,它使请求变慢,因为它有很多数据。

这是我在控制器上的代码

[HttpGet]
public IEnumerable<User> GetUsers()
{
    return _context.Users.Include( r => r.ReceiveAppointmentForms)
                          .Include(r => r.RequestAppointmentForms);
}

约会表格模型的代码

    [Key]
    public int AppointmentFormId { get; set; }
    public string AppointmentDate { get; set; }
    public DateTime AppointmentDateRequest { get; set; }
    public string AppointmentTimeStart { get; set; }
    public string AppointmentStatus { get; set; }
    public string AppointmentCancelComment { get; set; }

    public int? RequestUserId { get; set; }
    public int? ReceiveUserId { get; set; }

    public User RequestUser { get; set; }

    public User ReceiveUser { get; set; }
    public AppointmentRecord Record { get; set; }

【问题讨论】:

    标签: asp.net asp.net-core c#-4.0


    【解决方案1】:

    当您想使用 API 发送数据时,您可以做的一件事是创建一个新类。 它是安全的,您可以发送您只想要的任何数据。 (视图模型)

    如果您直接使用实体,WebAPI 会将所有参数模型绑定到它们,即使您不想这样做。 我的建议是创建一个新模型,然后发送您的数据

    public class UserViewModel
    {
        public int AppointmentFormId { get; set; }
        public string AppointmentDate { get; set; }
        public DateTime AppointmentDateRequest { get; set; }  
        //Your other data and tables you want
    }
    

    现在调用你的 Api 会是这样的

    [HttpGet]
    public IEnumerable<UserViewModel> GetUsers()
    {
    IEnumerable<UserViewModel> usersList = new List<UserViewModel>();
    foreach (var item in _context.Users.tolist())
    {
    userList.add(new UserViewModel{
    AppointmentFormId  = item.AppointmentFormId ,
    //other data
    });
    }
    

    简单又安全!

    you can check this link for more information

    【讨论】:

      【解决方案2】:

      这是循环引用的默认行为。

      Entity Framework Core 将自动修复导航属性 到之前加载到上下文中的任何其他实体 实例。因此,即使您没有明确包含 导航属性,如果某些或 所有相关实体之前都已加载。

      参考:Eager loading

      忽略receiveUser,你可以试试

      services.AddMvc()
          .AddJsonOptions(opt => {
              opt.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
          }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
      

      或者,您可以创建 ViewModel 并尝试 AutoMapper 将实体映射到视图模型。

      【讨论】:

        猜你喜欢
        • 2021-10-05
        • 1970-01-01
        • 2021-12-14
        • 2018-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        相关资源
        最近更新 更多