Реализация IEntityWithRelationships приводит к тому, что связанные объекты перестают загружаться - PullRequest
0 голосов
/ 26 января 2012

У меня есть две сущности, которые настроены с отношением «многие ко многим»:

Категория:

    public class Category : IEntityWithRelationships
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        public virtual ICollection<User> Users { get; set; }

        //Json.NET needs this in order to serialize the object
        private RelationshipManager rm;
        RelationshipManager IEntityWithRelationships.RelationshipManager
        {
            get
            {
                if (rm == null)
                    rm = RelationshipManager.Create(this);

                return rm;
            }
        }
    }

И пользователь:

    public class User
    {

        public int Id { get; set; }

        public ICollection<Category> Categories { get; set; }
    }

Связанные объекты загружались нормально, но тогда мне нужно было сериализовать объект категории в Json, и Json.Net продолжал выдавать:

Не удалось сериализовать объект RelationshipManager. Этот тип объект не может быть сериализован, когда RelationshipManager принадлежит объект сущности, который не реализует IEntityWithRelationships.

Итак, я реализовал интерфейс IEntityWithRelationships, но теперь мои связанные объекты не загружаются.

Я попробовал пользовательский ContractResolver, но я все еще получаю исключение выше. Как я могу загрузить свои связанные объекты?

Ответы [ 2 ]

1 голос
/ 26 января 2012

Вы не можете иметь такое взаимодействие в EF классах, потому что тогда EF не будет создавать прокси => Lazy loading отключено. http://msdn.microsoft.com/en-us/library/dd468057.aspx. На самом деле люди советуют отключать LazyLoading, когда вам нужно сериализовать ваши задачи (конечно, реализация этого интерфейса - неправильный способ сделать это). Вы должны больше узнать о том, как использовать EntityFramework с сериализацией.

0 голосов
/ 26 января 2012

Вы не должны реализовывать этот интерфейс в первых объектах кода.Реализация этого интерфейса нарушает POCO.Это интерфейс, используемый «тяжелыми» сущностями EF, и с его помощью вы потеряете способ, которым EF обрабатывает POCO.

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

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