2012-04-02 56 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 
    }; 
    

再次,它取決於你的情況。如果你將它序列化到你的視圖中,我認爲這不是一個好主意。如果你正在序列化到另一個應用程序,這不會是一個問題,所以保持這種方式,避免循環序列化。