2009-10-25 3 views
0

J'essaie de mettre à jour une entité à l'aide d'un stub. Cela fonctionne très bien pour changer les enregistrements, à moins que j'essaie de redéfinir la valeur à la valeur par défaut pour la colonne. Par exemple: Si la valeur par défaut est 0, je peux changer de et vers n'importe quelle valeur sauf zéro, mais les changements ne sont pas sauvegardés si j'essaie de le remettre à zéro. Voici le code que je utilise:Entity Framework: Retour à la valeur par défaut

var package = new Package() { 
    PackageID = 4 
}; 
... 
public static void EditPackage(Package package) { 
    using(var context = new ShopEntities()) { 
     context.Packages.MergeOption = MergeOption.NoTracking; 
     var existing = new Package() { 
      PackageID = package.PackageID 
     }; 
     context.AttachTo("Packages", existing); 
     context.ApplyPropertyChanges("ShopEntities.Packages", package); 
     context.AcceptAllChanges(); // doesn't make a difference 
     System.Diagnostics.Debug.WriteLine((package.DateSent.HasValue ? package.DateSent.Value.ToString("D") : "none") + "\t\t" + package.IsReceived); 
     context.SaveChanges(); 
    } 
} 

Dans l'exemple ci-dessus, la valeur par défaut de DateSent est nulle (Il est un DateTime?), Et je peux également le mettre à une valeur autre que nulle, et la ligne de débogage confirme que les propriétés correctes sont définies, elles ne sont simplement pas sauvegardées. Je pense que je dois manquer quelque chose.

Merci pour toute aide.

Répondre

1

Transforme ce que je devais faire était marquer manuellement chaque propriété dans le nouvel élément tel que modifié.

/// <summary> 
/// Sets all properties on an object to modified. 
/// </summary> 
/// <param name="context">The context.</param> 
/// <param name="entity">The entity.</param> 
private static void SetAllPropertiesModified(ObjectContext context, object entity) { 
    var stateEntry = context.ObjectStateManager.GetObjectStateEntry(entity); 
    // Retrieve all the property names of the entity 
    var propertyNames = stateEntry.CurrentValues.DataRecordInfo.FieldMetadata.Select(fm => fm.FieldType.Name); 
    foreach(var propertyName in propertyNames) {// Set each property as modified 
     stateEntry.SetModifiedProperty(propertyName); 
    } 
} 
0

Vous créez un nouveau package (avec l'identifiant d'un package existant), que vous appelez « existant ». Vous l'attachez ensuite comme s'il s'agissait d'un package existant. Vous devez charger ce package à partir de la base de données, puis l'attacher.

+0

La méthode que j'utilise fonctionne pour les modifications de toute valeur autre que la valeur par défaut. Je pense que c'est parce que l'objet est détaché le re-attaché, mais il a été discuté à http://stackoverflow.com/questions/1612655/entity-framework-updating-with-related-entity – Echilon

Questions connexes