C# 实体框架5 dbContext对象

C# 实体框架5 dbContext对象,c#,wcf,caching,entity-framework-5,C#,Wcf,Caching,Entity Framework 5,我们正在尝试编写一个WCF缓存服务,它使用ef5从数据库获取数据 问题在于序列化一个非常简单的模型 想想这个 我们在db有5000种产品。每个产品都有一个相关的制造商,比如说有两个制造商 对于缓存,我们关闭代理创建,这样当它被序列化时,我们就不会得到数据库中的每个对象。然后我们写 dbCtx.Configuration.ProxyCreationEnabled=false; var products=dbCtx.products.Include(“制造商”).ToDictionary(x=>x.

我们正在尝试编写一个WCF缓存服务,它使用ef5从数据库获取数据

问题在于序列化一个非常简单的模型

想想这个

我们在db有5000种产品。每个产品都有一个相关的制造商,比如说有两个制造商

对于缓存,我们关闭代理创建,这样当它被序列化时,我们就不会得到数据库中的每个对象。然后我们写

dbCtx.Configuration.ProxyCreationEnabled=false;
var products=dbCtx.products.Include(“制造商”).ToDictionary(x=>x.PartNo)

这将使所有5000种产品进入我们的缓存

然后我们有一个wcf方法

Product-GetProduct(字符串零件号)

如果我们调用GetProduct(“MyPart”),返回的对象就是我们想要的两个制造商之一的部件

以下是关联制造商具有返回产品的导航属性的捕获。 悬挂导航属性的还有2500种其他产品

这将产生一个非常大的序列化对象

似乎正在发生的事情。通过
dbCtx
从数据库检索5000种产品。 一旦它创造了所有5000种产品,并将它们放在上下文中,它就创造了制造商。在创建制造商的过程中,它会发现产品导航属性,并使用其本地上下文中的所有产品填充该属性。如果ProxyCreationEnabled为true,则会将代理对象放在导航属性上。我们希望它做的是忽略它已经知道的对象,并提供一个null或空集合,以便我们可以序列化我们想要的东西

我在EF4中做了一些这方面的工作,还记得当附加一个分离的对象时,有一个调用可以让你的分离对象与上下文中的所有其他对象相关联

我认为dbcontext代表我们发出了这个调用,我想阻止它


任何关于在何处查找更多信息或如何停止的建议都将非常有用。

考虑使用DTO通过WCF发送。如果您使用AutoMapper,这将减少从DTO转换到DTO的痛苦。@Aron我到现在还没有遇到DTO这个词。所以谷歌和维基页面告诉了我所有关于DTO的信息。因此,我对DTO的理解是,它们是简单的对象,只是属性的Set和Get,除了如何存储数据之外,没有其他逻辑。这正是我们所拥有的。您是否建议新的制造商对象不带产品的反向链接,从而避免额外的产品对象。术语DTO代表数据传输对象。这些对象专门用于跨网络传输(序列化)。在这种情况下,您只需执行相同的类(没有反向链接)。您可能想了解如何配置AutoMapper以将它们放回。