Propriété calculée de database qui est une key étrangère dans Entity Framework 6

Comment est-ce que je peux referencer une propriété pour être un ForeignKey branché à un champ calculé par DB (d'une vue)?

J'ai ce qui suit:

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; } //... } 

Chaque fois que j'essaie de mettre à jour une Person , j'obtiens l'excpetion suivante:

Message:

Une propriété dépendante dans un ReferentialConstraint est mappée à une colonne générée par le stockage. Colonne: 'MainPersonSiteId'. Trace de la stack:

à System.Data.Entity.Core.Mapping.Update.Internal.UpdateComstackr.BuildSetClauses (cible DbExpressionBinding, ligne PropagatorResult, PropagatorResult originalRow, processeur TableChangeProcessor, Boolean insertMode, Dictionary`2 & outputIdentifiers, DbExpression & return, Boolean & rowMustBeTouched) à System.Data. Entity.Core.Mapping.Update.Internal.UpdateComstackr.BuildUpdateCommand (PropagatorResult oldRow, PropagatorResult newRow, Processeur TableChangeProcessor) à System.Data.Entity.Core.Mapping.Update.Internal.TableChangeProcessor.ComstackCommands (ChangeNode changeNode, Compilateur UpdateComstackr)

Dans la database, qui est Sql Server 12, Person provient d'une vue, où MainPersonSiteId est projeté à partir d'une fonction. C'est un champ calculé, qui n'a pas besoin d'être mis à jour par l'ORM.

Comment le définir avec EntityFramework?

MODIFIER :

J'ai juste réussi à mettre à jour en fonctionnant en DatabaseGeneratedOption.Identity au lieu de DatabaseGeneratedOption.Computed , néanless je viens de find que les inserts étaient encore cassés. J'ai donc testé les inserts avec DatabaseGeneratedOption.Computed return et ça … travaillé: /

La situation est:
– Je ne peux insert qu'avec DatabaseGeneratedOption.Computed
– Je ne peux mettre à jour qu'avec DatabaseGeneratedOption.Identity

Il est étrange que MSDN indique que DatabaseGeneratedOption.Computed laisse la database générer une valeur pour les insertions et les mises à jour alors que DatabaseGeneratedOption.Identity ne le fait que pour les insertions

Les colonnes de la database définies comme IDENTITY sont différentes de celles de COMPUTED.

Lorsque vous insérez une nouvelle ligne, le moteur de database crée une nouvelle valeur (nombre) pour une IDENTITY-Column. Par exemple, vous pouvez l'utiliser comme colonne de key primaire / unique. Vous ne pouvez pas mettre à jour une colonne IDENTITY. Vous ne pouvez pas définir de formule pour effectuer des calculs.

Lorsque vous voulez calculer quelque chose au niveau de la table, vous pouvez utiliser des colonnes calculées. Ici vous devez définir une formule. Lorsque vous créez la colonne calculée avec l'option PERSISTED, SQL-Server stocke les valeurs calculées dans la table. Lorsque vous mettez à jour des colonnes faisant partie d'une colonne calculée, seule la colonne calculée est mise à jour. Les colonnes calculées PERSISTED peuvent faire partie de index-key-columns et de foreign keys. Lorsque vous n'utilisez pas l'option PERSISTED, la database ne stocke pas les valeurs calculées. Il doit donc faire le calcul chaque fois qu'une requête a besoin de la colonne calculée.

Lorsque vous mettez à jour une ligne, assurez-vous que la colonne calculée ne fait pas partie de la list des colonnes à mettre à jour (dans la clause SET d'une instruction UPDATE).

Vous pouvez définir des foreign keys uniquement entre des tables et non des vues.