实体框架持久化计算列问题
Posted
技术标签:
【中文标题】实体框架持久化计算列问题【英文标题】:Entity Framework persisted computed column woes 【发布时间】:2011-06-06 10:58:27 【问题描述】:由于查询时性能不佳,我最近更新了要持久化的计算列。
但是现在对子记录的更新会引发此错误
System.Data.SqlClient.SqlException
Internal Query Processor Error: The query processor could not produce a query plan. For more information, contact Customer Support Services.
有一个内部异常
An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types.
无论是否有列上的索引都会发生这种情况。
仅供参考,我对此列进行了配置:
Property(c => c.DisplayName).HasColumnName("DISPLAY_NM").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
有什么解决方法吗?
编辑
子元素声明是无关紧要的 - 但在这里。想象实体订单、公司(订单必须有公司)。我创建了一个带有未更改公司的订单及其带有导致问题的计算列的公司实体 - 它可以在计算列上没有持久性的情况下正常工作(正如预期的那样,订单上有 1 个插入语句和公司上有 0 个更新语句)
我认为this is the solution 但不确定如何在 EF 中做到这一点
【问题讨论】:
这需要更多信息才能理解您的问题。您指的是子记录,但我们不知道什么是子记录,什么是父记录以及您做了哪些更改。 Company 未更新并非总是如此:***.com/questions/6232185/… 首先使用 SQL Profiler 检查数据库层发生了什么。 尝试了所有这些。寻找建议重新:计算列是否持久化时它的工作差异 【参考方案1】:我通过添加相关实体的 ID 作为属性解决了类似的问题(基本上在表中暴露了 FK 值),并且在创建记录时,如果我只将相关对象的 id 分配给暴露的 FK 属性,一切正常,不需要相关对象.
您可以看到使用 EF 流体映射here 映射的具有相关对象及其 ID 的实体示例:
public ThingMap()
this.Property(t => t.Name)
.IsRequired()
.IsMaxLength()
.IsUnicode();
//// Table mappings
this.ToTable("Things", "go");
this.Property(t => t.Name).HasColumnName("Name");
this.Property(t => t.TypeId).HasColumnName("Type_Id");
//// References
this.HasRequired(t => t.Type)
.WithMany(t => t.Things)
.HasForeignKey(t => t.TypeId);
【讨论】:
以上是关于实体框架持久化计算列问题的主要内容,如果未能解决你的问题,请参考以下文章