我正在计划让两个或两个以上的人可以彼此约会。一切正常,但我只是意识到即使我没有将其包含在代码中,也会自动加载一些来自外键的数据。
这是我制作的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; }
答案 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
});
}
简单又安全!
答案 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。