使用EF进行序列化后,为什么会收到无效的JSON?

时间:2017-11-25 22:18:22

标签: c# json entity-framework serialization asp.net-core-2.0

我有以下两个模型,PatientRegistryPartnerRegistry。这些模型之间的关系是一对多的。

我正在尝试阅读该记录及其相关记录,但我在PartnerRegistry处收到了损坏的JSON。我让它工作的唯一方法是使用Automapper,但为什么会发生这种情况?我是否需要为第二个模型调用上下文?我的理解是,一旦建立关系,EF就会自动执行此操作。

编辑

我删除了一些道具只是为了缩短列表

[Table("PatientsRegistry")]
    public class PatientRegistry
    {   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Display(Name = "Record Id")]
        public long RecordId { get; set; }
        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Display(Name = "Patient File Number")]
        public long PatientFileId { get; set; }
        [Required, StringLength(50)]
        [Display(Name = "First Name")]
        public string FirstName { get; set; }
        [Required, StringLength(50)]
        public string SecondName { get; set; }
        [Required, StringLength(50)]        
        public string LastName { get; set; }
        public int GenderId { get; set; }
        public Gender Gender { get; set; }
        public DateTime DateCreated { get; set; } = DateTime.UtcNow;
        [Timestamp]
        public byte[] RowVersion { get; set; }
        public ICollection<PartnerRegistry> Partners { get; set; }
        public PatientRegistry()
        {
            Partners = new Collection<PartnerRegistry>();
        }

    }
public class PartnerRegistry
    {   
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long RecordId { get; set; }
        public long PatientFileId { get; set; }
        public long PartnerFileId { get; set; }
        public PatientRegistry PatientsRegistry { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime? EndDate { get; set; }

    }

我的控制器是

 [HttpGet("{id}")]
    public async Task<IActionResult> getAll(long Ids)
    {
          var patient = await context.PatientsRegistry
        .Include(pt => pt.Gender)
        .Include(pt => pt.Partners)
        .SingleOrDefaultAsync(pt => pt.PatientFileId == Ids);

        return Ok(patient);
    }

输出

{
    "recordId": 1,
    "patientFileId": 1111,
    "firstName": "John",
    "secondName": "M",
    "lastName": "Doe",
    "genderId": 1,
    "gender": {
        "id": 1,
        "name": "Male"
    },
    "dateCreated": "2017-11-25T08:40:07.75444",
    "rowVersion": "AAAAAAAAB9E=",
    "partners": [{
                "recordId": 1,
                "patientFileId": 1111,
                "partnerFileId": 2222

您可以注意到缺少ef未映射的属性! 未填充的属性为StartDateEndDate

1 个答案:

答案 0 :(得分:0)

更新

我也发现这个问题可以通过这种配置全局解决,

    services.AddMvc()
    .AddJsonOptions(options => 
     options.SerializerSettings.ReferenceLoopHandling =
     Newtonsoft.Json.ReferenceLoopHandling.Ignore);

Ref