1

Nous avons une application MVC qui crée des modèles d'entité et les stocke dans une session. Plus tard, nous voulons les valider dans la base de données. Juste essayer de faire unSimple Entity Framework 4 Ajout d'objet

db.Attendees.AddObject(attendee); 

jette l'erreur

The EntityKey property can only be set when the current value of the property is null. 

La clé de l'entité est juste un type simple de long et est une colonne d'identité dans la base de données. Qu'est-ce qui nous manque? Cela semble être une chose si simple à faire? Pour que les choses fonctionnent, nous avons dû créer une copie de l'objet et sauvegarder la copie. Ne pouvez-vous pas mettre en session des modèles de cadre d'entité, les retirer, puis les sauvegarder?

est ici la description dans le modèle Attendee Entity Framework ... il est un SQL Server frappe DB 2008

[EdmEntityTypeAttribute(NamespaceName="Model", Name="Attendee")] 
[Serializable()] 
[DataContractAttribute(IsReference=true)] 
public partial class Attendee : EntityObject 
{ 
    #region Factory Method 

    /// <summary> 
    /// Create a new Attendee object. 
    /// </summary> 
    /// <param name="attendeeID">Initial value of the AttendeeID property.</param> 
    /// <param name="firstName">Initial value of the FirstName property.</param> 
    /// <param name="lastName">Initial value of the LastName property.</param> 
    /// <param name="email">Initial value of the Email property.</param> 
    /// <param name="createdBy">Initial value of the CreatedBy property.</param> 
    /// <param name="createdOn">Initial value of the CreatedOn property.</param> 
    /// <param name="modifiedBy">Initial value of the ModifiedBy property.</param> 
    /// <param name="modifiedOn">Initial value of the ModifiedOn property.</param> 
    public static Attendee CreateAttendee(global::System.Int64 attendeeID, global::System.String firstName, global::System.String lastName, global::System.String email, global::System.String createdBy, global::System.DateTime createdOn, global::System.String modifiedBy, global::System.DateTime modifiedOn) 
    { 
     Attendee attendee = new Attendee(); 
     attendee.AttendeeID = attendeeID; 
     attendee.FirstName = firstName; 
     attendee.LastName = lastName; 
     attendee.Email = email; 
     attendee.CreatedBy = createdBy; 
     attendee.CreatedOn = createdOn; 
     attendee.ModifiedBy = modifiedBy; 
     attendee.ModifiedOn = modifiedOn; 
     return attendee; 
    } 

    #endregion 
    #region Primitive Properties 

    /// <summary> 
    /// No Metadata Documentation available. 
    /// </summary> 
    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] 
    [DataMemberAttribute()] 
    public global::System.Int64 AttendeeID 
    { 
     get 
     { 
      return _AttendeeID; 
     } 
     set 
     { 
      if (_AttendeeID != value) 
      { 
       OnAttendeeIDChanging(value); 
       ReportPropertyChanging("AttendeeID"); 
       _AttendeeID = StructuralObject.SetValidValue(value); 
       ReportPropertyChanged("AttendeeID"); 
       OnAttendeeIDChanged(); 
      } 
     } 
    } 
    private global::System.Int64 _AttendeeID; 
    partial void OnAttendeeIDChanging(global::System.Int64 value); 
    partial void OnAttendeeIDChanged(); 

Répondre

1

Vous devriez ajouterez, ne pas attacher, les nouveaux objets.

Mise à jour Si vous obtenez la même erreur lorsque vous AddObject, alors vous devez vous assurer que le StoreGeneratedPattern dans SSDL est réglé sur Identity. Le concepteur devrait faire cela pour vous si votre base de données est configurée correctement et votre fournisseur le prend en charge.

+0

Apparaît à la fois sur AddObject et sur Attach. – Josh

+0

Il frappe une boîte de serveur SQL et cette propriété est définie. Mis à jour ci-dessus pour afficher la description de l'objet. – Josh

+1

Cela devrait fonctionner. Faites bouillir votre code jusqu'à un simple cas et affichez-le ici. Il se passe quelque chose qui n'est pas dans votre question. –

1

Si l'élément n'existe pas dans la base de données, vous n'avez pas besoin d'appeler le contexte.Attach, seulement context.AddObject ou context.<collection>.Add.

+0

Mise à jour pour montrer l'erreur se produit avec AddObject. – Josh