【问题标题】:How to get EF POCOs from System.Data.Entities.DynamicProxies如何从 System.Data.Entities.DynamicProxies 获取 EF POCO
【发布时间】:2013-02-05 13:46:10
【问题描述】:

我的问题是same as this one

但是,我在那里并没有真正看到解决方案。假设我有一个简单的模型,其中包含两个 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 吗?这里有什么我完全想念的吗?

【问题讨论】:

    标签: entity-framework automapper poco


    【解决方案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;
            }
        }
    

    【讨论】:

    • 我想这是我真正想要的样本。感谢捆绑! ValueInjector 很棒。
    • 这种解决方案的唯一缺点是如何支持数据的双向传输。如何将 POCO 中的数据返回到附加的动态代理?
    • @qujck :相同的概念......只是反向从上下文中获取附加对象,然后从返回的 POCO 中注入 AttachedObject。让 EF 做变更跟踪
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多