ScriptIgnore属性在Linq to SQL中不起作用

时间:2012-04-02 09:51:32

标签: asp.net-mvc-3 linq-to-sql serialization

在使用JavaScriptSerializer进行序列化时,我在其中一个字段(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不起作用?

1 个答案:

答案 0 :(得分:0)

由于以下原因,我公司决定不直接序列化Linq2SQL实体:

  1. 每次重新生成.dbml时,它都会忽略您的属性声明并清除它们。
  2. 在我们的案例中,当我们将实体直接序列化到我们的观点时,我们对它进行了一些思考,我们意识到这种便利可能会带来一些问题。
  3. 关于原因的一些观点:

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

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

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