我们正在寻求使用Telerik DataAccess ORM的用户的帮助。最近,我们遇到了可以为空的外键的一个很大的性能问题。
当我们将值赋给nullable int外键属性(没有SaveChanges)时 - Telerik会对数据库进行多次调用并做一些奇怪的工作。我们使用了dotTrace,发现有很多SQL DataReader调用和一些奇怪的字符串/ DateTime / Enum / ...转换器。此问题仅在我们为属性设置值时才会出现,get工作正常。
关于我们的环境。我们尝试创建一个空的控制台应用程序。调用相同的奇怪代码,但它在本地环境中要快得多 - 对于小型实体和本地数据库来说约为60ms。对于大型实体,它是~1.5秒,,但在我们使用Azure Sql DB的生产服务器中 - 它是10到50秒。
备注:我们试图直接加载和设置对象,而不使用外键,它没有帮助。
public class Entity
{
public int? ParentId { get; set; } // Wee see this issue when we set value to the ParentId or Parent property. SaveChanges is not called.
public Parent Parent { get; set; }
}
Here你可以找到dotTrace调用堆栈。
答案 0 :(得分:0)
最后,我解决了这个问题。我想警告使用 IsManaged 配置的所有人。每次设置ParentId或Parent实体时,具有指定ParentId的所有子项都将加载到内存中。即使启用了延迟加载。
Telerik同意可以优化此行为,但由于向后兼容性,他们不希望进行任何更改。