实体框架-如何从System.Data.Enties.DynamicProxies获取EF POCO



我的问题与的问题相同

然而,我真的看不到解决方案。假设我有一个简单的模型,有两个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到Country的导航属性为NULL(不太好)。

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

我认为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;
        }
    }

相关内容

  • 没有找到相关文章

最新更新