我正在通过web api返回数据...
FMSEntities db = new FMSEntities();
db.Voucher_BankReceipt.Include(x => x.Status)
其中status是父表,它引用下面的hashsets中给出的其他子节点。
public Status()
{
this.Voucher_BankPayment = new HashSet<Voucher_BankPayment>();
this.Voucher_BankReceipt = new HashSet<Voucher_BankReceipt>();
this.Voucher_CashPayment = new HashSet<Voucher_CashPayment>();
this.Voucher_CashReceipt = new HashSet<Voucher_CashReceipt>();
this.Voucher_Journal = new HashSet<Voucher_Journal>();
this.Voucher_Log = new HashSet<Voucher_Log>();
this.Voucher_Workflow = new HashSet<Voucher_Workflow>();
}
在包括父表状态时,它包括所有引用的hashset对象。如何避免重新加载Voucher_BankReceipt和其他hashset json?
一般规则是永远不要将实体框架对象发送到Web API JSON Serializer中,您只需找出原因。
相反,您需要从EF中获取您需要的内容,或者您的API调用者需要的内容。串行器无法为您了解这一点。由于其性质,它几乎总是会占用太多,甚至可能导致循环错误。
解决方案是创建Objects / ViewModels,它复制调用者需要的EF对象部分,填充EF对象中的部分,然后返回它们。
一种快速而肮脏的方法是使用匿名对象,例如:
// Instead of "return EF_Product;" you can use this:
return new
{
Product = new
{
Id = EF_Product.Id,
Name = EF_Product.Name
}
};
一个好的经验法则是仅将EF对象中的简单属性(数字,布尔值,字符串,日期时间)分配给ViewModel项。一旦遇到另一个EF对象(或EF对象的集合)的EF对象属性,那么您需要将这些属性转换为未链接到EF的“简单”对象。
另一方面,有一些库,如AutoMapper。如果您确定需要实际的ViewModel类,则AutoMapper将帮助以非常结构化的方式将EF对象映射到那些ViewModel。