2012-04-02 40 views
0

在使用JavaScriptSerializer序列化时,我在其中一个字段(Linq to SQL模型)上发生错误。ScriptIgnore atribute在Linq to SQL中不起作用

Unhandled: A circular reference was detected while serializing an object of type 'Entity.ProductType'. 

我决定把ScriptIgnore属性忽略ProductType字段序列化。

public interface IProduct 
    { 
     [ScriptIgnore] 
     ProductType ProductType { get; set; } 

    } 

    [MetadataType(typeof(IProduct))] 
    public partial class Product : IProduct 
    { 
    } 

不幸的是我仍然得到错误。为什么ScriptIgnore不起作用?

+0

其他领域呢?你确定只有这个字段可以引起循环引用吗? – everton 2012-04-02 11:31:28

+0

是的,因为Exception给出了错误的字段名称。 – Tomas 2012-04-02 11:33:43

+1

使用视图模型。不要将您的域模型传递给视图。 – 2012-04-02 11:46:29

回答

0

由于以下原因,在我的公司,我们决定不再直接序列LINQ2SQL实体:

  1. 重新生成.dbml每一次,它忽略了你的属性的声明和清除它们。
  2. 在我们的案例中,当我们将实体直接序列化到我们的视图时,我们对其进行了一些思考,并意识到这种方便可能带来一些问题。

一些关于原因的要点:

  • 直接序列化仅仅是一个方便的,所以它会成为一种开销,如果我们通过网络序列化它。
  • .dbml.dbml更改,一个程序员可能会因为他不知道他添加的某些属性可能会带来循环问题而打破他人的工作。这是有益的。
  • 根据情况,暴露您的模型可能是危险的。
  • 暴露另一个对象并不是那么糟糕,只是用你需要的属性。例如:

    var person = personDAO.getById(123); 
    
    return new 
    { 
        Code = person.Id, 
        Name = person.FirstName + " " + person.LastName 
    }; 
    

再次,它取决于你的情况。如果你将它序列化到你的视图中,我认为这不是一个好主意。如果你正在序列化到另一个应用程序,这不会是一个问题,所以保持这种方式,避免循环序列化。