Entity Framework: как обновить свойства, допускающие обнуление

Скажем, у меня есть этот класс:

public class BuzzKill
{
public string Name {get;set;}
public DateTime? StrikeDate {get;set;}
}

Если я пишу экземпляр этого класса в базу данных с нулевым StrikeDate, затем попытайтесь обновить и сохранить его, используя метод ниже (взят из книги Джулии Лерман, DbContext), я получаю следующее исключение:

System.InvalidOperationException : The original value for the property 'StrikeDate' cannot be set to null because the 'StrikeDate' member on the entity type 'BuzzKill' is not nullable.

Очевидно, член обнуляется. У кого-нибудь есть обходной путь или решение? Я использую EF 5.0.

Вот код, который я использую для обновления сущностей, вместе с комментарием, отмечающим, где генерируется исключение:

 public virtual void ApplyChanges<TEntity>(TEntity root)
            where TEntity : class, IObjectWithState
        {
            using (var context = new AmazingChartsContext())
            {
                context.Set<TEntity>().Add(root);

                CheckForEntitiesWithoutStateInterface(context);

                foreach (var entry in context.ChangeTracker.Entries<IObjectWithState>())
                {
                    IObjectWithState stateInfo = entry.Entity;
                    entry.State = ConvertState(stateInfo.State);
                    if (stateInfo.State == State.Unchanged)
                    {                           
                        ApplyPropertyChanges(entry.OriginalValues, stateInfo.OriginalValues);
                    }
                }

                try
                {
                    context.SaveChanges();
                }
                catch (DbEntityValidationException ex)
                {
                   //stuff...

                }
            }
        }

        protected void ApplyPropertyChanges(DbPropertyValues values, Dictionary<string, object> originalValues)
        {
            foreach (var originalValue in originalValues)
            {
                if (originalValue.Value is Dictionary<string, object>)
                {
                    ApplyPropertyChanges((DbPropertyValues)values[originalValue.Key],
                        (Dictionary<string, object>)originalValue.Value);
                }
                else
                {
                    values[originalValue.Key] = originalValue.Value; //here's where the exception gets thrown
                }
            }
        }

(Я читал об этой проблеме здесь, но, похоже, никто не нашел ответа, кроме этой ошибки в 4.3.)

0 ответов

Другие вопросы по тегам