【问题标题】:Self referencing loop Entity FrameWork自引用循环实体框架
【发布时间】:2017-07-22 14:44:22
【问题描述】:

我目前正在使用 WebApi 2.0 和 EntityFrameWork,但遇到了问题:

检测到类型为“System.Data.Entity.DynamicProxies.UserInfo_F7C6DF3909A804C5A9AC107297C8851F4CC9DF1CCA4A689B892B6C6EBA5A6EA8”的属性“UserInfo”的自引用循环。路径 '[0].User'。”

我的DB是这样的:User-UserInfo和是1-1的关系,User的PK就是UserInfo中的PF;

public class User {    
        public int UserId { set; get; }
        public string username { set; get; }
        public string password { set; get; }
        public string name { set; get; }
        public string email { set; get; }
        public string surname { set; get; }
        public string lastName { set; get; }
        public int age { set; get; }
        public DateTime regDate { set; get; }
        public bool userType { set; get; }

        //we define our relationships
        //1-1 UserModel-UserInfo
        public virtual UserInfo UserInfo { set; get; }
}

我的 UserInfo 类:

public class UserInfo { 
    [Key, ForeignKey("User")]
    public int UserId { set; get; }        
    public string username { set; get; }        
    public string phone{ set; get; }        
    public string adress { set; get; }        
    public string country { set; get; }        
    public string city { set; get; }        
    public string zip { set; get; }

    //we define our relationships 
    //1-1 UserModel-UserInfo
    public virtual User User { set; get; }

}

在 Postman 中,我发送一个 Post 请求并注册一个用户:

{
  "username": "otmanlicona",
  "password": "pwd1234",
  "name": "Otman",
  "email": "otmanlicona17@mail.com",
  "surname": "licona",
  "lastName": "ledezma",
  "age": 33,
  "regDate": "2017-03-01T18:10:11+00:00",
  "userType": false
}

如果我发送一个 GET 请求,我会得到所有用户:

[
  {
    "Orders": [],
    "ReviewProducts": [],
    "UserInfo": null,
    "UserId": 7,
    "username": "otmanlicona",
    "password": "pwd1234",
    "name": "Otman",
    "email": "otmanlicona17@mail.com",
    "surname": "licona",
    "lastName": "ledezma",
    "age": 33,
    "regDate": "2017-03-01T12:10:11",
    "userType": false
  },
  {
    "Orders": [],
    "ReviewProducts": [],
    "UserInfo": null,
    "UserId": 8,
    "username": "angelsilva",
    "password": "pwd1234",
    "name": "angel",
    "email": "angelsilva@mail.com",
    "surname": "silva",
    "lastName": "borja",
    "age": 22,
    "regDate": "2017-03-01T12:10:11",
    "userType": true
  }
]

到目前为止没有问题,问题是当我插入用户信息时:

{
  "UserId": 8,
  "username": "angelsilva",
  "phone": "12345678",
  "adress": "550 Swallow Hill",
  "country": "USA",
  "city": "foo",
  "zip": "47-253"
}

如果我发送另一个 GET 请求,我会收到一个异常: Image of the error

检测到属性“UserInfo”的自引用循环

谁能告诉我我做错了什么?,谢谢

[
  {
    "Orders": [],
    "ReviewProducts": [],
    "UserInfo": null,
    "UserId": 7,
    "username": "otmanlicona",
    "password": "pwd1234",
    "name": "Otman",
    "email": "otmanlicona17@mail.com",
    "surname": "licona",
    "lastName": "ledezma",
    "age": 33,
    "regDate": "2017-03-01T12:10:11",
    "userType": false
  },
  {
    "Orders": [],
    "ReviewProducts": [],
    "UserInfo": {
      "UserId": 8,
      "username": "angelsilva",
      "phone": "12345678",
      "adress": "550 Swallow Hill",
      "country": "USA",
      "city": "foo",
      "zip": "47-253"
    },
    "UserId": 8,
    "username": "angelsilva",
    "password": "pwd1234",
    "name": "angel",
    "email": "angelsilva@mail.com",
    "surname": "silva",
    "lastName": "borja",
    "age": 22,
    "regDate": "2017-03-01T12:10:11",
    "userType": true
  }
]

现在我明白了实体框架中的自引用循环是什么意思;我可以在我的 Get 响应中执行什么操作,只返回不在用户类中的其他值,例如用户名、电话、地址、国家/地区等。

【问题讨论】:

  • 很可能没有人知道你做错了什么,你没有提供任何产生异常的代码。 How to create a Minimal, Complete and Verifiable example.
  • 接受 Yashveer 的回答,而不是将找到的解决方案添加到问题中。
  • 既然我找到了解决方案,我又提出了一个问题,我必须再问一个问题还是将其附加到这个问题上?
  • 你应该问一个新问题。

标签: c# entity-framework json.net


【解决方案1】:
try this on startup .cs 

 config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling 
= Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

【讨论】:

  • 谢谢我解决了这个问题: GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;基本上是一样的
  • @AngelSilva 很棒
  • 虽然这可以解决您的问题,但请考虑使用 DTO。
猜你喜欢
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多