【发布时间】:2015-05-11 19:00:11
【问题描述】:
我正在使用实体框架来拉回数据以在 Web API 服务中公开。我们的模型有一个 ProductDetails 对象,它有一个 Product 对象,它有一个 Category 对象。因此,在我的 Get 操作调用的上下文中,我要求它包括 Product(但不包括 Category):
results = context.ProductDetails.Include("Product");
所以,在我的服务结果中,我得到了例如(用于输入的 XML 缩写):
<ProductDetails>
...
<Product>
...
<Category>
<Name>Example Category name</>
...
</>
<CategoryId>1</>
</>
<ProductId>17</>
</>
我认为序列化会导致 Category 被“延迟加载”,即使我并不真正想要它。我如何避免得到比我要求的更多的东西?我想得到:
<ProductDetails>
...
<Product>
...
<Category i:nil="true"/>
<CategoryId>1</>
</>
<ProductId>17</>
</>
如何查询(或告诉序列化程序)保留 CategoryId 但不检索完整 Category?
编辑,供参考,这里是产品的型号:
[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; }
...
}
编辑:我的行为有些不一致——在 IIS 重置后的第一次加载,数据是我想要的。如果我重新加载页面,突然类别完全填充。这是线索吗?
【问题讨论】:
-
你能在
Product中显示Category的定义吗? -
我建议通过删除
virtual修饰符来强制加载。您现在必须使用.Include()显式加载它,但生成序列化数据现在将不再包含类别的数据。 -
移除虚拟修饰符不会导致行为改变。还有其他想法吗?
-
我的行为有些不一致 - IIS 重置后的第一次加载,数据如我所愿。但是,如果我重新加载页面,突然类别完全填充,就像每次后续加载一样。这是线索吗?
-
如果您没有明确或急切地加载它,删除虚拟应该会返回一个
null类别的值。对于突然的数据填充,我真的不能说任何有意义的事情。您是否有机会创建一个可重现的示例来在缩小的环境中显示这一点?能否显示用于在 EF 中查询数据库和配置 CategorySqlModel 的确切代码?
标签: c# entity-framework-5 asp.net-web-api