我有一个使用EF4访问SQL Server数据存储的库。出于不同的原因,我必须使用SQL Server特定语法从存储中读取数据(用于自由文本搜索),因此我必须手动创建SQL代码并通过ExecuteStoreQuery方法发送它。
这很好用,除了查询使用连接来请求除主要表之外的几个表(主要表是我在调用ExecuteStoreQuery时指定为目标实体集的表),并且EF从不填充主实体的关系属性与其他表的数据。
填补这些关系有什么特别之处吗?在查询中使用其他EF方法或使用特殊的表名吗?
感谢您的帮助。
答案 0 :(得分:3)
执行直接SQL遵循非常简单的规则:它使用结果集中的列来填充具体化实体中具有相同名称的属性。我想我在某处读到这只适用于您实现的主要实体(ExecuteStoreQuery
=无关系中定义的实体类型)但我现在找不到它。我做了几次测试,它确实没有填充任何关系。
答案 1 :(得分:3)
好的,所以我会在这里写下我最终做的事情,这看起来不是一个完美的解决方案,但在这种情况下似乎没有任何完美的解决方案。
正如Ladislav所指出的,ExecuteStoreQuery
(以及其他“自定义查询”方法Translate
)仅映射您指定的实体的列,而将所有其他列放在一边。因此,我必须单独加载依赖项,如下所示:
// Execute
IEnumerable<MainEntity> result = context.ExecuteStoreQuery<MainEntity>(strQuery, "MainEntities", MergeOption.AppendOnly, someParams).ToArray();
// Load relations, first method
foreach (MainEntity e in result)
{
if (!e.Relation1Reference.IsLoaded)
e.Relation1Reference.Load();
if (!e.Relation2Reference.IsLoaded)
e.Relation2Reference.Load();
// ...
}
// Load relations, second method
// The main entity contains a navigation property pointing
// to a record in the OtherEntity entity
foreach(OtherEntity e in context.OtherEntities)
context.OtherEntities.Attach(e);
有。我认为必须根据生成的请求的数量和大小来选择这两种技术。第一种技术将为每个所需的侧记录生成一条记录请求,但不会加载任何不合格的记录。第二种技术使用较少的请求(每个表一个)但检索所有记录,因此它使用更多内存。