2009-10-25 3 views
0

Я пытаюсь обновить объект с помощью заглушки. Это отлично работает для изменения записей, если я не попытаюсь вернуть значение по умолчанию для столбца. Например: если значение по умолчанию равно 0, я могу изменить значение и из любого значения, кроме нуля, но изменения не сохраняются, если я попытаюсь установить его на ноль. Это код, я использую:Entity Framework: вернуть значение по умолчанию

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(); 
    } 
} 

В приведенном выше примере, значение DateSent по умолчанию равно нулю (Это DateTime?), И я также может установить любое значение, отличное от NULL, и отладки линии подтверждает, что установлены правильные свойства, они просто не сохранены. Кажется, я что-то упускаю.

Спасибо за любую помощь.

ответ

1

Оказалось, что мне нужно было вручную отметить каждое свойство в новом элементе, как изменено.

/// <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

Вы создаете новый пакет (с идентификатором существующего пакета), который вы называете «существующим». Затем вы прикрепляете его, как если бы это был существующий пакет. Вы должны загрузить этот пакет из базы данных и затем прикрепить его.

+0

Метод, который я использую, работает для изменений любого значения, отличного от значения по умолчанию. Я думаю, что это потому, что объект отсоединен от повторного подключения, но он обсуждался на http://stackoverflow.com/questions/1612655/entity-framework-updating-with-related-entity – Echilon

Смежные вопросы