【问题标题】:AutoMapper does not unproxy NHibernate entityAutoMapper 不取消代理 NHibernate 实体
【发布时间】:2015-09-17 00:54:51
【问题描述】:

考虑这个实体:

public class CondRule
{
    public virtual decimal Id { get; set; }
    public virtual string Name { get; set; }
    public virtual CondRuleType RuleType { get; set; }
    public virtual string Statement { get; set; }
}

CondRuleType 是:

public class CondRuleType
{
   public virtual int Id { get; set; }
   public virtual string Name { get; set; }
}

很明显CondRuleCondRuleType 实体之间存在一对一的关系。

我还有CondRuleDto:

public class CondRuleDto
{
    public decimal Id { get; set; }
    public string Name { get; set; }
    public CondRuleType RuleType { get; set; }
}

我已使用AutoMapperCondRule 映射到CondRuleDto

Mapper.CreateMap<CondRule, CondRuleDto>();

当我通过 id 调用 Session.Get 以获取 CondRule 并将结果映射到 CondRuleDto 时,AutoMapper 不会解析代理(此处为 RuleType)。 这是我的代码:

var condRule = Session.Get<CondRule>(id);
var condRuleDto = Mapper.Map<CondRuleDto>(condRule);

当我观看 condRuleDto 时,RuleType 属性是 NHibernate 代理。我希望 AutoMapperRuleType 代理映射到 POCO。如何使这项工作?

PS:我不得不提一下,当我使用查询并使用 automapper 的 Project 时,它会产生一个没有代理的列表(我知道 Project 会发生这种情况。可能是我需要Project 之类的东西在Session.Get 之后使用):

Session.Query<CondRule>().Project().To<CondRuleDto>().ToList()

【问题讨论】:

    标签: c# nhibernate asp.net-web-api automapper


    【解决方案1】:

    强制转换不会更改底层对象(即,即使您将 CondRuleType 的实例映射到另一个 CondRuleType 类型的属性,您的 CondRuleType 仍将是代理)。

    您似乎需要创建一个自定义映射,其中 CondRule.RuleType 被映射创建一个 CondRuleType 的新实例。

    【讨论】:

    • 如何进行自定义映射?
    • @alisabzevari 试试这个:stackoverflow.com/questions/9132251/…(我在工作,我不能尝试……但它可能在正确的轨道上)
    • 谢谢,但我想通过电话自动映射器自动取消代理每个代理对象。有了你的解决方案,我必须为每个实体的每个引用属性定义自定义映射。
    • @alisabzevari 通过一些努力,我相信您可以概括解决方案...归根结底,您不能指望 AutoMapper 能够“按原样”解决您的方案...我相信它可能会通过一些反射来内省属性类型并使用Activator.CreateInstance创建一个实例来修复...
    • 我知道我必须使用反射。问题是我不知道我必须在哪里编写这段代码,或者当它看到这些类执行我的操作以执行映射时如何告诉 automapper
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多