2012-07-24 57 views
0

我有一个EF对象:序列化对象EF成JSON - ASP.NET MVC

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序列化。

任何人都有解决这个问题的好方法吗? IS EF 5.0将解决这个问题?

非常感谢。

回答

0

可以只要有它们之间没有循环引用序列化与关系实体。这意味着如果你有A指向B,并且B指向A,它不会。我怀疑你的CurrentMasterEntity将永远等于实体本身,或者可能有圆形图形(A是B的主人,B是A的主人),所以你有一个数据错误或双向导航(大多数它通常以Entity ParentICollection<Entity> Children的形式出现)。如果这是一个数据错误,只需修复它。如果您有双向导航,则必须选择一个将被序列化的属性,并使用[ScriptIgnore]标记另一个属性,以便不会被序列化为

但是,如果你真的不需要在客户端的CurrentMasterEntity,只需将它标记为[ScriptIgnore]即可。

+0

我已编辑您的答案,请参阅我的意见。非常感谢并保持联系。 – VAAA 2012-07-24 19:05:44

+0

我从控制器返回实体,如下所示: var userObj = db.Users.Where(u => u.UserId == id).FirstOrDefault(); return PartialView(userObj); 可以么? – VAAA 2012-07-24 19:07:25

+0

我拒绝了你的修改,对不起,应该是另一个评论。但是你说你添加'ScriptIgnore'并没有任何反应。我怀疑以下两件事之一:或者你的班级里有更多你向我们展示的内容,或者因为代理EF构建在班级之上,Json序列化会变得困惑。你真的需要它吗?如果不是,请尝试从您的课堂*中删除'虚拟'修饰符并*放置'ScriptIgnore'。 – 2012-07-24 19:11:06