2

如何将属性引用为插入数据库计算字段的 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; }

      //...
}

每当我尝试更新 aPerson时,我都会收到以下异常:

信息:

ReferentialConstraint 中的依赖属性映射到存储生成的列。列:'MainPersonSiteId'。堆栈跟踪:

在 System.Data.Entity.Core.Mapping.Update.Internal.UpdateCompiler.BuildSetClauses(DbExpressionBinding 目标,PropagatorResult 行,PropagatorResult originalRow,TableChangeProcessor 处理器,布尔插入模式,Dictionary`2& outputIdentifiers,DbExpression& 返回,Boolean&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 说DatabaseGeneratedOption.Computed数据库为插入和更新生成一个值,而DatabaseGeneratedOption.Identity只为插入生成一个值

4

1 回答 1

1

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

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

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

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

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

于 2016-02-17T10:55:23.263 回答