マッパーのインスタンス バージョンを使用して、AutoMapper でネストされたマッピングを使用しようとしていますが、機能していないようです。
私が使用している2つのモデルは次のとおりです。
public class User
{
[Key]
public string Email { get; set; }
public string Hash { get; set; }
public string Salt { get; set; }
public string Name { get; set; }
public virtual ICollection<TaskTime> TaskTimes { get; set; }
public virtual ICollection<Role> Roles { get; set; }
public virtual ICollection<HistoricalEstimation> HistoricalEstimations { get; set; }
}
public class TaskTime
{
public int Id { get; set; }
public User User { get; set; }
public Task Task { get; set; }
public TimeSpan Duration { get; set; }
public DateTime Date { get; set; }
}
そして、私はこのコードを使用してそれらをマッピングしています:
public static class UserViewConfiguration
{
private static ConfigurationStore configuration;
public static MappingEngine Engine { get; private set; }
static UserViewConfiguration()
{
configuration = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers());
Engine = new MappingEngine(configuration);
configuration.CreateMap<User, UserFull>();
configuration.CreateMap<TaskTime, UserTaskTime>();
/* snip... */
configuration.AssertConfigurationIsValid();
}
}
これらのビューモデルに:
public class UserFull
{
public string Email { get; set; }
public string Name { get; set; }
public virtual ICollection<TaskTime> TaskTimes { get; set; }
}
public class UserTaskTime
{
public int Id { get; set; }
public Task Task { get; set; }
public TimeSpan Duration { get; set; }
public DateTime Date { get; set; }
}
問題は、 aUser
が a を含み、TaskTime
aが a をTaskTime
含むことUser
です。最初に要求したオブジェクトに応じて、各アイテムに到達する方法がいくつかあるため、このサイクルが存在する必要があります (これが、AutoMapper のインスタンス バージョンを使用している理由です)。ASP.NET MVC API アプリを介して送信するためにこれらをシリアル化しているため、サイクルは大きな問題です。
AutoMapper でネストされたマッピングを使用するこの例を読みましたが、正しくやっていることがわかります。User
しかし、上記のマッピングでは、 path に対して自己参照ループ エラーが発生しています[0].TaskTimes[0].User.TaskTimes
。TaskTimes
のプロパティをコメントアウトしてもUserFull
エラーは発生しないので、User->UserFull
マッピングが機能していることはわかっていますが、何らかの理由でが機能しTaskTime->UserTaskTime
ていません。
私に何ができる?
編集:私はこのようにマッピングしています:
// GET api/Users
public IEnumerable<UserFull> GetUsers()
{
//var query = SelectUsers(db.Users.ToList());
return UserViewConfiguration.Engine.Map<IEnumerable<UserFull>>(db.Users);
}