Атрибут ScriptIgnore не работает в Linq to SQL - PullRequest
0 голосов
/ 02 апреля 2012

Я получаю сообщение об ошибке в одном из полей (модель Linq to SQL) при сериализации с помощью JavaScriptSerializer.

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 голосов
/ 02 апреля 2012

По следующим причинам в моей компании мы решили не сериализовать сущности Linq2SQL напрямую:

  1. Каждый раз, когда .dbml генерируется заново, он игнорирует ваши объявления атрибутов и очищает их.
  2. В нашем случае, когда мы сериализовали сущности непосредственно в наши Видения, мы подумали над этим и поняли, что удобство может принести некоторые проблемы.

Некоторые моменты о причинах:

  • Прямая сериализация - это просто удобство, поэтому она может стать дополнительной, если мы сериализовали ее по сети.
  • .dbml изменяется, и один программист может прервать работу другого только потому, что он не знал, что какое-то добавленное им свойство может вызвать циклические проблемы. Это ненормально.
  • В зависимости от случая разоблачение вашей модели может быть опасным.
  • Не так уж плохо выставить другой объект, просто с нужными вам свойствами. Пример: * +1021 *

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

Опять же, это зависит от вашего случая. Если вы сериализуете его на ваш взгляд, я не думаю, что это хорошая идея. Если вы сериализуете его в другое приложение, это не будет проблемой, поэтому сохраняйте его таким образом и избегайте циклической сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...