数据库计算属性,它是实体框架6中的外键

时间:2016-02-17 09:03:25

标签: c# sql-server entity-framework entity-framework-6 computed-properties

如何将属性引用为插入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只为插入执行

1 个答案:

答案 0 :(得分:1)

定义为IDENTITY的数据库中的列与COMPUTED列中的列不同。

插入新行时,数据库引擎会为IDENTITY-Column创建新值(编号)。例如,您可以将其用作主/唯一键列。您无法更新IDENTITY列。您无法定义进行计算的公式。

如果要在表级别计算某些内容,可以使用计算列。在这里你必须定义一个公式。使用PERSISTED选项创建计算列时,SQL Server将计算值存储在表中。更新属于计算列的列时,只有计算列才会更新。 PERSISTED计算列可以是索引键列和外键的一部分。 如果不使用PERSISTED选项,则数据库不会存储计算值。因此,每次查询需要计算列时,都必须进行计算。

更新行时,请确保计算列不是要更新的列列表的一部分(在UPDATE语句的SET子句中)。

您只能在表之间定义FOREIGN KEY,而不能在视图之间定义。