此问题似乎与我的previous question相关。
我现在已经在我的整个应用程序中完成了AutoMapper的实现,而且我在一个非常具体的情况下无法正常工作的地图。
我已经将一个单元测试与一些能够每次重现问题的假类组合在一起,单元测试本身有一些设置,将ActiveRecord配置为针对我未包含在内存中的内存数据库运行(让我知道它是否相关)。
以下是单元测试:
<div class="container">
<div id="main" class="logo">Some Logo <span>Some tag line.</span>
</div>
<ul class="menu">
<li>Home</li>
<li>Products</li>
<li>Price Sheet</li>
<li>Capabilities</li>
<li>Contact</li>
</ul>
</div>
Transaction.CreateParticipant是设置SessionScope的包装器,这里是实现:
[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; }
}
测试的最后一行将引发以下异常:
return new ActiveRecordTransactionParticipant((TransactionScope)SessionScope.Current
?? new TransactionScope())
现在,如果将测试更改为仅映射到LazyCustomer,它将按预期工作,或者如果将地图调用移动到第一个事务中它们都工作,则重新排序这两行,以便首先映射惰性客户也可以。< / p>
我的猜测是,城堡代理在某种程度上造成了这种情况,但我无法弄清楚如何或如何可靠地解决这个问题。
修改:我在失败的行上设置了一个断点,并在即时窗口中运行System.InvalidCastException : Unable to cast object of type 'MyProject.TestCustomer'
to type 'MyProject.TestLazyCustomer'.
,这返回dbCustomer.GetType()
,这似乎至少部分地证实了我的怀疑,当它们在同一个事务中时,映射可以正常工作,因为该对象实际上是Castle.Proxies.TestDbPartyProxy
的实例,而不是代理。
这肯定是问题,在删除TestDbParty
类Lazy=true
后,测试工作正常。
答案 0 :(得分:0)
这在Auto Mapper中是一个错误,重现的确切标准如下:
映射需要使用运行时对象派生的源类型进行映射,在示例的情况下,是运行时使用的Active Record Proxy类型。
至少需要两种可能的目的地类型,其中一种应该继承另一种。
最后,只有在首先映射到基本目标类然后映射到派生目标时才会出现问题,这是因为使用了映射缓存机制。
已为此创建git hub issue。
我不知道这个问题的任何可能的解决办法。