Automapper и отображение Родитель / Дочерние отношения вызывает ошибку StackOverflow, когда Entity Framework генерирует DynamicProxies? - PullRequest
1 голос
/ 01 февраля 2012

Я перепробовал много вариантов, чтобы Automapper правильно отобразил отношения Родитель / Дочерний.

Модель:

//Entity
public class WorkArea
{
  public Guid Id;
  public Name {get;set;}
  public Guid? ParentWorkAreaId {get;set;} //for entity Framework Foreign Key 
  public WorkArea ParentWorkArea {get;set;}
  public ICollection<WorkArea> ChildWorkareas {get;set;}
}

//DTO
public class WorkAreaDto
{
  public Guid Id;
  public Name {get;set;}
  public Guid? ParentWorkAreaId {get;set;} //for entity Framework Foreign Key 
  public WorkAreaDto ParentWorkArea {get;set;}
  public ICollection<WorkAreaDto> ChildWorkareas {get;set;}
}

Это отображение вызывает переполнение стека:

Mapper.CreateMap<WorkArea,WorkAreaDto>();

Я пробовал что-то в точности как этот и имел ту же ошибку

Затем я создал пользовательский TypeConverter, но я должен не только писать рекурсивные методы для детей, но и для родителей.Похоже, что много работы действительно сделать это правильно сопоставить.Не уверен, что делаю что-то не так.Я использую 2.0

Обновление: Я думаю, что моя проблема связана с System.Data.Entity.DynamicProxies, созданными Entity Framework.

1 Ответ

1 голос
/ 06 февраля 2012

Это прекрасно работает для меня, возможно, вам стоит проверить свои данные:

        [TestMethod]
        public void TestMethod1()
        {
            Mapper.CreateMap<WorkArea, WorkAreaDto>();

            var source = CreateSource();

            WorkAreaDto destination = new WorkAreaDto();
            Mapper.Map(source, destination);

            Assert.AreEqual(destination.ChildWorkareas.Count, 3);

        }

        private WorkArea CreateSource()
        {
            var id = Guid.NewGuid();

            var result = new WorkArea();
            result.Id = id;
            result.Name = "Name" + id.ToString();
            result.ParentWorkArea = CreateSourceParent(result);
            result.ParentWorkAreaId = result.ParentWorkArea.Id;
            result.ChildWorkareas = CreateSourceChildren(result);

            return result;
        }

        private ICollection<WorkArea> CreateSourceChildren(WorkArea parent)
        {
            var result = new Collection<WorkArea>
                {
                new WorkArea() { Id = Guid.NewGuid(), Name = "Child1", ParentWorkArea = parent, ParentWorkAreaId = parent.Id },
                new WorkArea() { Id = Guid.NewGuid(), Name = "Child2", ParentWorkArea = parent, ParentWorkAreaId = parent.Id },
                new WorkArea() { Id = Guid.NewGuid(), Name = "Child3", ParentWorkArea = parent, ParentWorkAreaId = parent.Id }
                };

            return result;
        }

        private WorkArea CreateSourceParent(WorkArea source)
        {
            var id = Guid.NewGuid();

            var result = new WorkArea();
            result.Id = id;
            result.Name = "Name" + id.ToString();
            result.ChildWorkareas = new Collection<WorkArea>
            {
                source
            };

            return result;

        }
...