即使我没有包含外键中的某些数据也会自动加载

时间:2019-07-06 11:17:19

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

我正在计划让两个或两个以上的人可以彼此约会。一切正常,但我只是意识到即使我没有将其包含在代码中,也会自动加载一些来自外键的数据。

这是我制作的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”(这是指向User表的外键)。 因为我没有在网页上使用该信息,并且由于包含大量数据,因此使请求变慢了。

这是我在控制器上的代码

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

2 个答案:

答案 0 :(得分:0)

要使用API​​发送数据时,您可以做的一件事就是创建一个新类。 这是安全的,您可以发送只想要的任何数据。 (ViewModels)

如果直接使用实体,则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

答案 1 :(得分:0)

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

  

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

参考:Eager loading

要忽略receiveUser,可以尝试

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

或者,您可以创建ViewModel并尝试使用AutoMapper将实体映射到viewmodel。