AutoMapper - отображение свойств от одного объекта EF4 к другому в цикле без Before / AfterMap - PullRequest
0 голосов
/ 25 июня 2011

Похоже, что методы AutoMapper BeforeMap и AfterMap имеют критическую ошибку, которая, если кто-то пытается перебрать коллекцию исходного объекта для заполнения свойства объекта назначения, эти методы отображения выполняются более одного раза , См .: Дополнительные итерации в foreach на карте AutoMapper

То, что я пытаюсь сделать, немного сложно, поэтому, пожалуйста, потерпите меня.

У меня есть график EF4 «многие ко многим» («Игры для платформ»), который я пытаюсь построить на основе входящих данных формы. Чтобы построить график, я беру необработанные целочисленные идентификаторы из формы, а затем беру нужные Платформы из своего репозитория, чтобы добавить их в коллекцию Игры. Вы можете увидеть мою попытку сделать это в BeforeMap по ссылке, которую я предоставил выше.

Проблема в том, что я не уверен, что делать дальше. Мне нужно иметь возможность захватить объект назначения (Game), чтобы успешно Add Platforms to the Game. Возможно ли что-то подобное в ForMember? Из того, что я прочитал, не похоже, что пользовательский распознаватель будет работать для меня, и я не уверен, как реализовать преобразователь пользовательских типов с учетом всех движущихся частей (две сущности, хранилище).

Есть идеи или предложения?

1 Ответ

0 голосов
/ 29 июня 2011

Я просто решил сделать свой собственный статический картограф. Не идеальное или даже отличное решение, но оно работает. Это, безусловно, можно сделать более абстрактным, но я думаю, что это лейкопластырь, пока AutoMapper не будет исправлен. Мое решение:

public static class GameMapper
{
    public static Game Map(IGameRepository repo, AdminGameEditModel formData, Game newGame)
    {
        newGame.GameID = formData.GameID;
        newGame.GameTitle = formData.GameTitle;
        newGame.GenreID = formData.GenreID;
        newGame.LastModified = DateTime.Now;
        newGame.ReviewScore = (short)formData.ReviewScore;
        newGame.ReviewText = formData.ReviewText;
        newGame.Cons = String.Join("|", formData.Cons);
        newGame.Pros = String.Join("|", formData.Pros);
        newGame.Slug = formData.Slug;

        if (newGame.Platforms != null && newGame.Platforms.Count > 0)
        {
            var oldPlats = newGame.Platforms.ToArray();

            foreach (var oldPlat in oldPlats)
            {
                newGame.Platforms.Remove(oldPlat);
            }
        }

        foreach (var platId in formData.PlatformIDs)
        {
            var plat = repo.GetPlatform(platId);
            newGame.Platforms.Add(plat);
        }

        return newGame;
    }
}

К сожалению, я не могу сделать третий параметр параметром out из-за необходимости перезаписывать существующие данные объекта во время обновления. Опять же, это определенно не красивое или даже хорошее решение, но оно делает свою работу. Я уверен, что OO боги поразят меня позже.

...