0

我的问题和这个一样

但是,我在那里并没有真正看到解决方案。假设我有一个简单的模型,其中包含两个 POCO,即 Country 和 State。

public class Country
{
    public string Code { get; set; }
    public string Name { get; set; }
}
public class State 
{
    public string Code { get; set; }
    public string Name { get; set; }

    public virtual Country Country { get; set; }
}

当我使用 .GetStateByCode(myCode) 的存储库时,它会检索一个动态代理对象。我想使用 WCF 服务通过网络将其发送给我的客户。动态代理不是已知类型,因此它会失败。

这是我的替代方案。我可以在上下文中将 ProxyCreationEnabled 设置为 false,然后我的 .GetStateByCode(myCode) 给了我一个很棒的 POCO。但是,POCO to Country 中的导航属性为 NULL(不是很好)。

我应该新建一个状态 POCO 并手动填充并从存储库返回的动态代理返回它吗?我应该尝试使用 AutoMapper 将动态代理对象映射到 POCO 吗?这里有什么我完全想念的吗?

4

1 回答 1

1

我认为 Ladislav Mrnka 的答案很明确。警告仍然适用。即使下面有这个想法。小心被捡起的东西。他只是没有包括,如果你想继续如何轻松地将数据从对象 a 获取到对象 B。这确实是手头的问题。

样品溶液

请参阅 nuget 包ValueInjecter (不是唯一可以执行此操作的工具......但非常易于使用)它允许将一个对象轻松复制到另一个对象,尤其是具有相同属性和类型的对象。(记住延迟加载/导航的含义)。

所以香草选项是:

 var PocoObject = new Poco();
 PocoObject.InjectFrom(DynamicProxy); // copy contents of DynamicProxy to PocoObject

但检查默认行为并考虑自定义规则

     var PocoObject = new Poco();
     PocoObject.InjectFrom<CopyRule>(DynamicProxy);

 public class CopyRule : ConventionInjection
    {
        protected override bool Match(ConventionInfo c)
        {
            bool usePropertry;   // return if the property it be included in inject process
            usePropertry = c.SourceProp.Name == "Id";  // just an example
            //or
            // usePropertry = c.SourceProp.Type... == "???"
            return usePropertry;
        }
    }
于 2013-02-05T14:38:15.890 回答