【问题标题】:Serialize EF Object into JSON - ASP.NET MVC将 EF 对象序列化为 JSON - ASP.NET MVC
【发布时间】:2012-07-24 15:42:42
【问题描述】:

我有一个 EF 对象:

public class User
{

    [Key, Column("userid", TypeName = "int")]
    public Int32 UserId { get; set; }

    [Column("username", TypeName = "varchar")]
    public String UserName { get; set; }

    [Column("password", TypeName = "varchar")]
    public String Password { get; set; }

    [Column("name", TypeName = "varchar")]
    public String Name { get; set; }

    [Column("surname", TypeName = "varchar")]
    public String Surname { get; set; }

    [Column("email", TypeName = "varchar")]
    public String Email { get; set; }

    [Column("dob", TypeName = "datetime")]
    public Nullable<DateTime> Dob { get; set; }

    [Column("notes", TypeName = "nvarchar")]
    public String Notes { get; set; }

    [Column("masterentity", TypeName = "varchar")]
    public String MasterEntity { get; set; }

    [Column("propertyid", TypeName = "int")]
    public Nullable<Int32> PropertyId { get; set; }

    [Column("boardmember", TypeName = "bit")]
    public Boolean BoardMember { get; set; }

    [Column("occupiesunit", TypeName = "bit")]
    public Boolean OccupiesUnit { get; set; }

    [Column("systemuser", TypeName = "bit")]
    public Boolean SystemUser { get; set; }

    [Column("isactive", TypeName = "bit")]
    public Boolean IsActive { get; set; }


    #region Foreing Keys

    [ForeignKey("MasterEntity")]
    public virtual Entity CurrentMasterEntity { get; set; }

    #endregion

}

在客户端我尝试将模型序列化为 JSON 对象,如下所示:

var jsonUser = @(Html.Raw(Json.Encode(this.Model))); 

我收到以下错误:

A circular reference was detected while serializing an object of type ....

我意识到,如果我删除 Foreing Keys Fluent API

[ForeignKey("MasterEntity")]
public virtual Entity CurrentMasterEntity { get; set; }

然后它就完美了。所以似乎与其他实体有关系的实体或对象无法使用 JSON 序列化。

谁有解决这个问题的好方法? EF 5.0 会解决这个问题吗?

非常感谢。

【问题讨论】:

    标签: asp.net-mvc json entity-framework


    【解决方案1】:

    可以序列化具有关系的实体,只要它们之间没有循环引用。这意味着如果你有A 指向B,而B 又指向A,它就不行了。我怀疑您的 CurrentMasterEntity 是否会等于实体本身,或者是否可能存在圆形图(A 是 B 的主控,B 是 A 的主控),因此您有数据错误或双向导航(通常以Entity ParentICollection&lt;Entity&gt; Children 的形式出现)。如果这是一个数据错误,只需修复它。如果您有双向导航,则必须选择一个将被序列化的属性,并用[ScriptIgnore] 标记另一个属性,这样它不会被序列化。

    但如果您在客户端真的不需要CurrentMasterEntity,只需将其标记为上述[ScriptIgnore]

    【讨论】:

    • 我已编辑您的答案,请参阅我的 cmets。非常感谢并保持联系。
    • 我像这样从控制器返回实体: var userObj = db.Users.Where(u => u.UserId == id).FirstOrDefault();返回部分视图(用户对象);这样可以吗?
    • 我拒绝了您的编辑,抱歉,应该作为另一条评论。但是你说你添加了ScriptIgnore 并且没有任何反应。我怀疑以下两件事之一:要么你向我们展示了你的课程,要么因为代理 EF 构建在你的课程之上,Json 序列化变得混乱。你真的需要吗?如果没有,请尝试从您的班级中删除 virtual 修饰符放入 ScriptIgnore
    • 是的,这是我真正需要的东西,我要做的是创建一个没有任何 Fluent API 东西的 Clone 类(一个干净的类),然后使用 AutoMapper 将 EF 对象映射到这个干净的类.这种方式有效.. 但如果 EF 让您直接这样做会很棒。
    • 你需要 EF 代理做什么?
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2011-02-26
    • 2012-04-06
    • 2016-12-22
    相关资源
    最近更新 更多