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.不要这样做。就这么简单 您在帖子中声明要序列化对象的父对象,对吗 现在让我们看看当你做这样的事情时会发生什么
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图序列化问题…或缺少它) 我将按照所需的最短开发时间和实现复杂性[“一举两得”]与可伸缩性、可维护性和性能[“经得起未来考验”]的顺序列出每种方法
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;
}
}