C# 如何禁止由于序列化而延迟加载子对象?
我正在使用实体框架提取数据以在Web API服务中公开。我们的模型有一个ProductDetails对象,它有一个Product对象,它有一个Category对象。因此,在我的Get操作调用的上下文中,我要求它包括产品(但不包括类别): 因此,在我的服务结果中,我得到了例如(XML因键入而缩短):C# 如何禁止由于序列化而延迟加载子对象?,c#,entity-framework-5,asp.net-web-api,C#,Entity Framework 5,Asp.net Web Api,我正在使用实体框架提取数据以在Web API服务中公开。我们的模型有一个ProductDetails对象,它有一个Product对象,它有一个Category对象。因此,在我的Get操作调用的上下文中,我要求它包括产品(但不包括类别): 因此,在我的服务结果中,我得到了例如(XML因键入而缩短): 编辑:我得到了一些不一致的行为——IIS重置后的第一次加载,数据是我想要的。如果我重新加载页面,类别会突然被完全填充。这是一个线索吗?我还怀疑延迟加载是原因,因为序列化程序将访问相关对象的每个属性。也
编辑:我得到了一些不一致的行为——IIS重置后的第一次加载,数据是我想要的。如果我重新加载页面,类别会突然被完全填充。这是一个线索吗?我还怀疑延迟加载是原因,因为序列化程序将访问相关对象的每个属性。也许您可以关闭整个上下文的延迟加载,而只使用即时加载?下面显示了如何关闭上下文的延迟加载:
public class SomeContext : DbContext
{
public SomeContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}
您应该以包含CategoryId的序列化对象结束,而不是Category对象本身。您可以在
产品中显示类别
的定义吗?我建议通过删除虚拟
修饰符来强制执行即时加载。您现在必须使用.Include()
显式加载它,但生成序列化数据将不再包含类别的数据。删除虚拟修饰符不会导致行为更改。还有其他想法吗?我的行为有些不一致——IIS重置后的第一次加载,数据是我想要的。但是,如果我重新加载页面,类别会突然完全填充,就像每次后续加载一样。这是一个线索吗?如果您没有显式地或急切地加载虚拟目录,那么删除虚拟目录应该会为您返回一个null
值。对于突然出现的数据量,我真的说不出任何有意义的话。您是否有可能创建一个在小型环境中显示这一点的可复制示例?您能否显示用于查询数据库和在EF中配置CategorySqlModel的确切代码?请忽略前面的注释。我检查过了,这已经完成了!懒散是错误的。奇怪的还可能是什么?
<ProductDetails>
...
<Product>
...
<Category>
<Name>Example Category name</>
...
</>
<CategoryId>1</>
</>
<ProductId>17</>
</>
<ProductDetails>
...
<Product>
...
<Category i:nil="true"/>
<CategoryId>1</>
</>
<ProductId>17</>
</>
[Table("PRODUCT", Schema = "MySchema")]
public class ProductSqlModel
{
private CustomTypeConverter _converter = new CustomTypeConverter();
[Key]
[Column("CODE")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public virtual int? Id { get; set; }
[Column("CATEGORY_CODE")]
public virtual int? CategoryId { get; set; }
[ForeignKey("CATEGORY_ID")]
public virtual CategorySqlModel Category { get; set; }
...
}
public class SomeContext : DbContext
{
public SomeContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}