Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架和XmlIgnoreAttribute_Entity Framework - Fatal编程技术网

Entity framework 实体框架和XmlIgnoreAttribute

Entity framework 实体框架和XmlIgnoreAttribute,entity-framework,Entity Framework,假设您在实体模型中有一对一关系。代码生成器将使用以下属性对其进行修饰: [global::System.Xml.Serialization.XmlIgnoreAttribute()] [global::System.Xml.Serialization.SoapIgnoreAttribute()] public RelatedObject Relationship { get {...} set {...} } 我想序列化父对象及其所有属性,这些属性的数据已通过XMLWeb服务加载。显然,由于这

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

[global::System.Xml.Serialization.XmlIgnoreAttribute()]
[global::System.Xml.Serialization.SoapIgnoreAttribute()]
public RelatedObject Relationship { get {...} set {...} }
我想序列化父对象及其所有属性,这些属性的数据已通过XMLWeb服务加载。显然,由于这些属性,这些相关属性不会被序列化

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

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

否则我如何实现我想做的事情?从我的应用程序中为每个子对象单独调用?假设我返回了数百个父对象;我也得打几百个电话给每个孩子

我如何永久地摆脱这些属性


VS 2008/EF 3.5.

不要这样做。就这么简单

您在帖子中声明要序列化对象的父对象,对吗

现在让我们看看当你做这样的事情时会发生什么

  • 序列化程序开始转换对象及其属性
  • 当它找到对象的父对象时,它开始序列化它
  • 序列化父对象时,if找到它正在序列化的子对象并返回到1
  • 如果没有一些鼓励,它永远也出不来

    因此,这些属性存在是有充分理由的。

    保罗是正确的(+1),但他没有告诉你如何解决问题。因为XML序列化是一个合法的用例,即使序列化实体是一种错误的方式

    投影到匿名类型上,并将其序列化。例如,要序列化为JSON,我需要:

    var q = from e in Context.MyEntities
            where // ...
            select new
            {
                Id = e.Id,
                Children = from c in e.Children
                           select new 
                           {
                               Id = c.Id,
                               // etc.
                           },
                // etc.
            };
    return Json(q);
    

    这保证了没有循环引用等,而且它是有效的。

    这里有一个鲜为人知的事实实体框架+Web服务=:'(

    有三(3)种方法可以用来解决您的问题(即XML图序列化问题…或缺少它)

    我将按照所需的最短开发时间和实现复杂性[“一举两得”]与可伸缩性、可维护性和性能[“经得起未来考验”]的顺序列出每种方法

  • 当通过线路发送时,为每个实体创建用于投影的POCO类。这是最简单(也是最单调)的方法,但可以解决您的问题。我在最后提供了一个示例

  • 使用WCF中继您的数据。实体框架和WCF就像“来自不同母亲的兄弟”。它们旨在一起工作,但共享它们的差异。您会注意到,所有EF生成的实体对象本质上都是[DataConctract],所有字段都是[DataMember]。这使得使用WCF DataContract序列化程序可以非常高效地处理图形,并且即使在反序列化之后也可以维护对象引用。WCF DataContract序列化程序也被证明比默认的XML序列化程序快10%

  • 使用EF 4.0自跟踪实体(STE)。这仍然是非常新的,但它是可行的。在Visual Studio 2010中,您可以选择生成为N层和SOA设计的自跟踪实体。STE的最大优点是使用T4转换的文本模板来生成代码。T4生成的类干净且具有很强的可塑性,为您提供了大量的插入空间这是一个指向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
    
    }
    

    没有-我正在序列化父对象,它工作正常,但它的子对象没有被序列化。我只是在原始问题中添加了一些更多的信息,以指示我在查询中如何只包含()将那些应该序列化的属性重新命名,因此我将保证没有循环。感谢这个Craig。我不相信这是唯一的方法。我们从自动生成数据层的EF中获得的速度,现在已经失去了手动为ser创建这些临时对象的能力序列化。这里我肯定遗漏了一些东西,但我们似乎又前进了一步,又后退了一步……。在我滚动自己的数据层时,最棒的事情是序列化/反序列化完全由web服务代理类抽象。我的服务只返回了普通对象,不必我担心序列化,我的应用程序只接收了正常的.NET对象,不必担心反序列化。现在两端都必须手动处理序列化?这不是EF设计上的一个巨大疏忽吗?EF没有限制。是XML序列化程序不能处理循环引用,不是EF。如果您不喜欢所使用的序列化程序的限制,您可以自由编写/查找自己的序列化程序。此外,使用EF并不意味着您需要返回实体类型;您可以改为投影到POCO上。
    [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;
        }
    }