如何在请求子 class 时阻止 Automapper 映射到父 class
How to stop Automapper from mapping to parent class when child class was requested
我正在努力在我们的服务中实施 AutoMapper,并且在我们的单元测试中发现了一个非常令人困惑的问题。
首先,此问题涉及以下对象及其各自的地图:
public class DbAccount : ActiveRecordBase<DbAccount>
{
// this is the ORM entity
}
public class Account
{
// this is the primary full valued Dto
}
public class LazyAccount : Account
{
// this class as it is named doesn't load the majority of the properties of account
}
Mapper.CreateMap<DbAccount,Account>();
//There are lots of custom mappings, but I don't believe they are relevant
Mapper.CreateMap<DbAccount,LazyAccount>();
//All non matched properties are ignored
它还涉及这些对象,虽然我此时还没有用 AutoMapper 映射它们:
public class DbParty : ActiveRecordBase<DbParty>
{
public IList<DbPartyAccountRole> PartyAccountRoles { get; set; }
public IList<DbAccount> Accounts {get; set;}
}
public class DbPartyAccountRole : ActiveRecordBase<DbPartyAccountRole>
{
public DbParty Party { get; set; }
public DbAccount Account { get; set; }
}
这些 类 使用包含以下内容的自定义代码进行转换,其中 source
是 DbParty:
var party = new Party()
//field to field mapping here
foreach (var partyAccountRole in source.PartyAccountRoles)
{
var account = Mapper.Map<LazyAccount>(partyAccountRole.Account);
account.Party = party;
party.Accounts.Add(account);
}
我遇到问题的测试创建了一个新的 DbParty,2 个新的 DbAccounts 链接到新的 DbParty,2 个新的 DbPartyAccountRoles 都链接到新的 DbParty,每个 DbAccounts 各 1 个。
然后它通过 DbParty 存储库测试一些更新功能。如果需要,我可以为此添加一些代码,它只需要一些时间来清理。
当 运行 本身这个测试工作得很好,但是当 运行 在与另一个测试(我将在下面详述)的同一会话中时,上面转换代码中的 Mapper 调用抛出这个异常:
System.InvalidCastException : Unable to cast object of type '[Namespace].Account' to type '[Namespace].LazyAccount'.
另一个测试也创建了一个新的 DbParty,但只有一个 DbAccount,然后创建了 3 个 DbPartyAccountRoles。我能够将这个测试缩小到打破另一个测试的确切行,它是:
Assert.That(DbPartyAccountRole.FindAll().Count(), Is.EqualTo(3))
注释掉这一行允许其他测试通过。
根据这些信息,我猜测测试失败是因为与调用 AutoMapper 时 DbAccount 对象后面的 CastleProxy 有关,但我一点也不知道是如何发生的。
我现在已经设法 运行 相关的功能测试(对服务本身进行调用)并且它们似乎工作正常,这让我认为单元测试设置可能是一个因素,最值得注意的是有问题的测试是 运行 针对内存数据库中的 SqlLite。
问题最终在单元测试中多次与 运行 AutoMapper Bootstrapper 有关;调用是在我们测试基地 class.
的 TestFixtureSetup 方法中
修复方法是在创建地图之前添加以下行:
Mapper.Reset();
我仍然很好奇为什么只有这张地图有问题。
我正在努力在我们的服务中实施 AutoMapper,并且在我们的单元测试中发现了一个非常令人困惑的问题。
首先,此问题涉及以下对象及其各自的地图:
public class DbAccount : ActiveRecordBase<DbAccount>
{
// this is the ORM entity
}
public class Account
{
// this is the primary full valued Dto
}
public class LazyAccount : Account
{
// this class as it is named doesn't load the majority of the properties of account
}
Mapper.CreateMap<DbAccount,Account>();
//There are lots of custom mappings, but I don't believe they are relevant
Mapper.CreateMap<DbAccount,LazyAccount>();
//All non matched properties are ignored
它还涉及这些对象,虽然我此时还没有用 AutoMapper 映射它们:
public class DbParty : ActiveRecordBase<DbParty>
{
public IList<DbPartyAccountRole> PartyAccountRoles { get; set; }
public IList<DbAccount> Accounts {get; set;}
}
public class DbPartyAccountRole : ActiveRecordBase<DbPartyAccountRole>
{
public DbParty Party { get; set; }
public DbAccount Account { get; set; }
}
这些 类 使用包含以下内容的自定义代码进行转换,其中 source
是 DbParty:
var party = new Party()
//field to field mapping here
foreach (var partyAccountRole in source.PartyAccountRoles)
{
var account = Mapper.Map<LazyAccount>(partyAccountRole.Account);
account.Party = party;
party.Accounts.Add(account);
}
我遇到问题的测试创建了一个新的 DbParty,2 个新的 DbAccounts 链接到新的 DbParty,2 个新的 DbPartyAccountRoles 都链接到新的 DbParty,每个 DbAccounts 各 1 个。 然后它通过 DbParty 存储库测试一些更新功能。如果需要,我可以为此添加一些代码,它只需要一些时间来清理。
当 运行 本身这个测试工作得很好,但是当 运行 在与另一个测试(我将在下面详述)的同一会话中时,上面转换代码中的 Mapper 调用抛出这个异常:
System.InvalidCastException : Unable to cast object of type '[Namespace].Account' to type '[Namespace].LazyAccount'.
另一个测试也创建了一个新的 DbParty,但只有一个 DbAccount,然后创建了 3 个 DbPartyAccountRoles。我能够将这个测试缩小到打破另一个测试的确切行,它是:
Assert.That(DbPartyAccountRole.FindAll().Count(), Is.EqualTo(3))
注释掉这一行允许其他测试通过。
根据这些信息,我猜测测试失败是因为与调用 AutoMapper 时 DbAccount 对象后面的 CastleProxy 有关,但我一点也不知道是如何发生的。
我现在已经设法 运行 相关的功能测试(对服务本身进行调用)并且它们似乎工作正常,这让我认为单元测试设置可能是一个因素,最值得注意的是有问题的测试是 运行 针对内存数据库中的 SqlLite。
问题最终在单元测试中多次与 运行 AutoMapper Bootstrapper 有关;调用是在我们测试基地 class.
的 TestFixtureSetup 方法中修复方法是在创建地图之前添加以下行:
Mapper.Reset();
我仍然很好奇为什么只有这张地图有问题。