Entity Framework: установите значение по умолчанию - PullRequest
0 голосов
/ 25 октября 2009

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

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 по умолчанию равно null (это DateTime?), И я также могу установить для него любое значение, отличное от null, и строка отладки подтверждает, что установлены правильные свойства, они просто не сохраняются , Я думаю, что я что-то упускаю.

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

Ответы [ 2 ]

1 голос
/ 26 октября 2009

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

/// <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 голосов
/ 25 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...