0

我有一个 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 会解决这个问题吗?

非常感谢。

4

1 回答 1

0

只要实体之间没有循环引用,就可以序列化具有关系的实体。这意味着,如果您A指向B,又B指向A,则不会这样做。我怀疑您CurrentMasterEntity是否会等于实体本身,或者是否可能存在圆形图(A 是 B 的主人,B 是 A 的主人),所以您要么有数据错误,要么有双向导航(最常见的是它以Entity Parent和的形式出现ICollection<Entity> Children。如果这是一个数据错误,只需修复它。如果您有双向导航,则必须选择一个将被序列化的属性,并用标记另一个属性,[ScriptIgnore]这样它就不会被序列化。

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

于 2012-07-24T17:56:43.593 回答