如何使用Entity Framework仅包含父表?

问题描述 投票:1回答:1

我正在通过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?

json entity-framework asp.net-web-api
1个回答
3
投票

一般规则是永远不要将实体框架对象发送到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。

© www.soinside.com 2019 - 2024. All rights reserved.