自动映射器无法将Castle Active Record Proxy映射到多个目标类型

时间:2015-09-14 22:11:36

标签: c# automapper castle-activerecord

此问题似乎与我的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的实例,而不是代理。

这肯定是问题,在删除TestDbPartyLazy=true后,测试工作正常。

1 个答案:

答案 0 :(得分:0)

这在Auto Mapper中是一个错误,重现的确切标准如下:

映射需要使用运行时对象派生的源类型进行映射,在示例的情况下,是运行时使用的Active Record Proxy类型。

至少需要两种可能的目的地类型,其中一种应该继承另一种。

最后,只有在首先映射到基本目标类然后映射到派生目标时才会出现问题,这是因为使用了映射缓存机制。

已为此创建git hub issue

我不知道这个问题的任何可能的解决办法。