如何将属性引用为插入DB计算字段的ForeignKey(从视图中)?
我有以下内容:
public class PersonSite
{
public int Id {get;set;}
//...
public int PersonId {get;set;}
[ForeignKey("PersonId")]
public virtual Person Person {get;set;}
//...
}
public class Person
{
public Id {get;set;}
//...
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public int? MainPersonSiteId { get; protected internal set; }
[ForeignKey("MainPersonSiteId")]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public PersonSite MainPersonSite { get; protected internal set; }
//...
}
每当我尝试更新Person
时,我都会遇到以下问题:
消息:
ReferentialConstraint中的依赖属性映射到a 存储生成的列。专栏:' MainPersonSiteId'。堆栈跟踪:
在 System.Data.Entity.Core.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding target,PropagatorResult row,PropagatorResult originalRow, TableChangeProcessor处理器,布尔insertMode,Dictionary`2& outputIdentifiers,DbExpression&返回,布尔& rowMustBeTouched) 在 System.Data.Entity.Core.Mapping.Update.Internal.UpdateCompiler.BuildUpdateCommand(PropagatorResult oldRow,PropagatorResult newRow,TableChangeProcessor处理器) System.Data.Entity.Core.Mapping.Update.Internal.TableChangeProcessor.CompileCommands(ChangeNode changeNode,UpdateCompiler编译器)
在数据库中,即Sql Server 12,Person来自一个视图,其中MainPersonSiteId是从一个函数投射的。这是一个计算字段,不需要由ORM更新。
如何使用EntityFramework定义它?
编辑:
我刚刚通过设置DatabaseGeneratedOption.Identity
而不是DatabaseGeneratedOption.Computed
设法让更新正常工作,但我刚发现插入内容仍然存在。所以我用DatabaseGeneratedOption.Computed
测试了插件,然后工作:/
情况是:
- 我只能插入DatabaseGeneratedOption.Computed
- 我只能使用DatabaseGeneratedOption.Identity
奇怪的是MSDN says DatabaseGeneratedOption.Computed
让数据库为插入和更新生成值,而DatabaseGeneratedOption.Identity
只为插入执行
答案 0 :(得分:1)
定义为IDENTITY的数据库中的列与COMPUTED列中的列不同。
插入新行时,数据库引擎会为IDENTITY-Column创建新值(编号)。例如,您可以将其用作主/唯一键列。您无法更新IDENTITY列。您无法定义进行计算的公式。
如果要在表级别计算某些内容,可以使用计算列。在这里你必须定义一个公式。使用PERSISTED选项创建计算列时,SQL Server将计算值存储在表中。更新属于计算列的列时,只有计算列才会更新。 PERSISTED计算列可以是索引键列和外键的一部分。 如果不使用PERSISTED选项,则数据库不会存储计算值。因此,每次查询需要计算列时,都必须进行计算。
更新行时,请确保计算列不是要更新的列列表的一部分(在UPDATE语句的SET子句中)。
您只能在表之间定义FOREIGN KEY,而不能在视图之间定义。