Этот вопрос связан с моим previous question.Auto mapper не может отобразить Замок Active Record Proxy для нескольких типов назначения
Я закончил реализацию AutoMapper по всему моему приложению, и я дошел до одной карты, которая в особых обстоятельствах не работает.
Я собрал единичный тест с некоторыми поддельными классами, которые могут каждый раз воспроизводить проблему, сам тест устройства имеет некоторую настройку, которая настраивает ActiveRecord для работы с базой данных в памяти, которую я здесь не включил (пусть я знаю, может ли это быть релевантным).
Вот тестовый модуль:
[Test]
public void SandBox()
{
Mapper.CreateMap<TestDbParty, TestCustomer>();
Mapper.CreateMap<TestDbParty, TestLazyCustomer>();
string customerId;
using (Transaction.CreateParticipant())
{
var dbCustomer = new TestDbParty();
dbCustomer.Save();
customerId = dbCustomer.Id;
}
using (var uow = Transaction.CreateParticipant())
{
var dbCustomer = TestDbParty.Find(customerId);
var customer = Mapper.Map<TestCustomer>(dbCustomer);
var lazyCustomer = Mapper.Map<TestLazyCustomer>(dbCustomer);
}
}
//Fake classes for unit test
public class TestCustomer
{}
public class TestLazyCustomer : TestCustomer
{}
[ActiveRecord("PARTY", Lazy = true)]
public class TestDbParty : DbActiveRecord<TestDbParty>
{
[PrimaryKey(PrimaryKeyType.Sequence, "ID", SequenceName = "PARTY_ID_SQ")]
public virtual string Id { get; set; }
}
Transaction.CreateParticipant является оболочкой для настройки SessionScope, здесь реализация:
return new ActiveRecordTransactionParticipant((TransactionScope)SessionScope.Current
?? new TransactionScope())
Последняя строка теста выбросит следующее исключение:
System.InvalidCastException : Unable to cast object of type 'MyProject.TestCustomer'
to type 'MyProject.TestLazyCustomer'.
Теперь, если тест изменен для отображения только на LazyCust omer работает так, как ожидалось, или если вызовы карты перемещаются в первую транзакцию, с которой они работают, переупорядочивая две линии, чтобы сначала отображался ленивый клиент.
Мое предположение заключается в том, что прокси-сервер Castle каким-то образом вызывает это, но я не могу понять, как и как я могу надежно исправить это.
Edit: я ставлю точку останова на неисправной линии и побежал dbCustomer.GetType()
в ближайшем окне, это возвращается Castle.Proxies.TestDbPartyProxy
так, что кажется, подтверждает мое подозрение, по крайней мере частично, отображение будет работать нормально, когда они находятся в том же потому что объект infact экземпляр TestDbParty
, а не прокси.
Это определенно проблема, после удаления Lazy=true
на классе TestDbParty
тест работает нормально.