假设您的实体模型中有一对一的关系。代码生成器将使用以下属性对其进行修饰:

[global::System.Xml.Serialization.XmlIgnoreAttribute()]
[global::System.Xml.Serialization.SoapIgnoreAttribute()]
public RelatedObject Relationship { get {...} set {...} }

我想序列化我的父对象及其所有已通过 XML Web 服务加载数据的属性。显然,由于这些属性,这些相关属性不会被序列化。

因此,出于我的目的,我只想删除这些“不要序列化我”的属性。我可以在设计器代码中进行查找和替换,但我在设计器中所做的任何修改都会将这些属性放回原处。

在我的查询中,我使用了 .Include() 并显式加载了序列化所需的子对象。所以我会确保我的查询中没有循环。有些子属性不是必需的,所以我不会 Include() 它们,所以它们不会被序列化。

否则我如何实现我想做的事?从我的应用程序中为每个子对象单独调用?假设我要返回数百个父对象;我也必须打数百个单独的电话才能得到每个 child 。

如何永久摆脱这些属性?

VS 2008/EF 3.5。

最佳答案

这是一个鲜为人知的事实... Entity Framework + Web 服务 = :'(

可以采用三 (3) 种方法来解决您的问题(即 XML 图形序列化问题......或缺乏它)。

我将按照所需的最少开发时间和实现复杂性 [“Bang-For-Buck”] 与可扩展性、可维护性和性能 [“Future Proofing”] 的顺序列出每种方法。

  • 为每个实体创建 POCO 类,以便在通过网络发送时进行投影。这是最简单(且单调)的方法,但可以解决您的问题。我在最后附上了一个样本。
  • 使用 WCF 中继您的数据。 Entity Framework 和 WCF 就像“异母兄弟”。他们被设计为一起工作,但分享他们的差异。您会注意到所有 EF 生成的实体对象本质上都是 [DataConctract],所有字段都是 [DataMember]。这使得 WCF DataContract Serializer 能够非常有效地处理图形,并且即使在反序列化之后也能维护对象引用。 WCF DataContract Serializer 也被证明比默认的 XML Serializer 快 10%。
  • 使用 EF 4.0 自跟踪实体 (STE)。这仍然是非常新的,但它是可行的。在 Visual Studio 2010 中,您可以选择生成专为 N 层和 SOA 设计的自跟踪实体。 STE 最好的一点是使用 T4 转换文本模板来生成代码。 T4 生成的类干净且可塑性很强,为您提供了足够的空间来插入您的逻辑和验证。 Here 是 STE 教程的链接,可帮助您入门。

  • 祝你好运,我希望你找到最适合你的方法。

    POCO 示例。
    public class CustomerPOCO
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public List<SubLocationPOCO> SubLocations { get; set; }
        // ...
    
        #region Ctors
    
        public CustomerPOCO() { }
    
        public CustomerPOCO(Customer customer)
        {
            // Inits
            if (customer.SubLocations != null)
                SubLocations = customer.SubLocations.Select(sl => new SubLocationPOCO(sl)).ToList();
        }
    
        #endregion
    
    }
    
    
    public class SubLocationPOCO
    {
        public int ID { get; set; }
        public string Name { get; set; }
    
        #region Ctors
    
        public SubLocationPOCO() { }
    
        public SubLocationPOCO(SubLocation subLocation)
        {
            // Inits
        }
    
        #endregion
    
    }
    

    而你的 [WebMethod] 就是这样的。
    [WebMethod]
    public CustomerPOCO GetCustomerByID(int customerID)
    {
        using (var context = new CustomerContext())
        {
            var customer = (from customer in context.Customers.Include("SubLocations")
                            where customer.ID == customerID
                            select new CustomerPOCO(customer)).FirstOrDefault();
    
            return customer;
        }
    }
    

    关于entity-framework - Entity Framework 和 XmlIgnoreAttribute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2444733/

    10-15 19:11