2017-07-04 3 views
0

J'ai une classe appelée Address qui est une table versionnée du système. J'essaie d'insérer dans ce tableau en utilisant le contexte de cadre d'entité en ajoutant un objet au contexte et en faisant ensuite un appel SaveChanges. Cela a fonctionné comme prévu lorsque la table n'était pas versionnée du système. Dans mon modèle qui ressemble à ceci moins certaines propriétés qui ne sont pas liées à cette question:Entity Framework Ignorer les propriétés lors de l'insertion de données avec des tables temporelles

 [DataMember] 
     public System.DateTime SysStartTime 
     { 
      get { return _sysStartTime; } 
      set 
      { 
       if (_sysStartTime != value) 
       { 
        _sysStartTime = value; 
        OnPropertyChanged("SysStartTime"); 
       } 
      } 
     } 
     private System.DateTime _sysStartTime; 

     [DataMember] 
     public System.DateTime SysEndTime 
     { 
      get { return _sysEndTime; } 
      set 
      { 
       if (_sysEndTime != value) 
       { 
        _sysEndTime = value; 
        OnPropertyChanged("SysEndTime"); 
       } 
      } 
     } 
     private System.DateTime _sysEndTime; 

     [DataMember] 
     public int AddressId 
     { 
      get { return _addressId; } 
      set 
      { 
       if (_addressId != value) 
       { 
        if (ChangeTracker.ChangeTrackingEnabled && ChangeTracker.State != ObjectState.Added) 
        { 
         throw new InvalidOperationException("The property 'AddressId' is part of the object's key and cannot be changed. Changes to key properties can only be made when the object is not being tracked or is in the Added state."); 
        } 
        _addressId = value; 
        OnPropertyChanged("AddressId"); 
       } 
      } 
     } 
     private int _addressId; 

Ce tableau historique a été créé par la documentation avec un produit toujours propriété et valeur cachée par défaut. Lorsque je tente de faire un simple insert j'obtiens l'erreur:

Cannot insert value into generated always identity column

Je comprends ce que l'erreur est dit, mais je ne sais pas comment le résoudre. J'ai essayé de supprimer les propriétés SysStartTime et SysEndTime du modèle mais cela me donne des problèmes de validation. J'ai également essayé de ne pas définir les propriétés sur le modèle comme DataMember et même IgnoreDataMember mais le résultat était toujours le même. Ma question est comment puis-je supprimer les propriétés SysStartTime et SysEndTime de l'objet avec le modèle d'adresse avant de l'ajouter au contexte? Je vous remercie.

MISE À JOUR: J'ai utilisé ce code pour créer ma table temporelle:

ALTER TABLE [dbo].[Address] ADD 
          [SysStartTime] datetime2(0) GENERATED ALWAYS AS ROW START HIDDEN NOT NULL CONSTRAINT DF_Telco_SysStartTime DEFAULT '1900-01-01 00:00:00', 
          [SysEndTime] datetime2(0) GENERATED ALWAYS AS ROW END HIDDEN NOT NULL CONSTRAINT DF_Telco_SysEndTime DEFAULT '9999-12-31 23:59:59', 
          PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime]) 

ALTER TABLE [dbo].[Address] 
          SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[Address_History])); 
+0

Avez-vous une colonne d'identité dans la table? Pouvez-vous fournir le code dans lequel vous attribuez les valeurs. – Harsh

+0

mis à jour la question avec le code de la table temporelle pertinente – xDevil

+0

Je ne définis jamais les valeurs SysStartTime et SysEndTime ils vont juste à la valeur par défaut de min DateTime – xDevil

Répondre

0

J'ai trouvé une solution à ce problème en modifiant le fichier model.edmx et en ajoutant à la propriété SysStartTime et SysEndTime StoreGeneratedPattern="Computed".