假设您的实体模型中有一对一的关系。代码生成器将使用以下属性对其进行修饰:
[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 示例。
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/