Код EF4.1 сначала добавляет объект со связанным объектом - PullRequest
1 голос
/ 09 августа 2011

Сначала я использую код EF4.1. Я не могу получить очень простую вставку для сохранения идентификатора связанной сущности. Сгенерированный SQL всегда вставляет NULL для любых связанных объектов. Пример кода приведен ниже. Кто-нибудь может увидеть, что я здесь делаю не так? Он правильно вставляет не-сущностные свойства, такие как строки. Также у меня есть подобный код в классе инициализатора БД для заполнения тестовых данных, и он, кажется, работает нормально.

        using (var ctx = new DataContext())
        {
            ctx.Users.Attach(existingUser);

            // create item and add to context
            var newItem = new MyItem();
            ctx.MyItems.Add(newItem);

            // set related entity
            newItem.CreatedBy = existingUser;

            ctx.SaveChanges();
        }

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Ваш код должен работать с конфигурацией по умолчанию вашего DbContext.Одним из возможных объяснений того, что это не работает, является то, что у вас отключено автоматическое обнаружение изменений, например, если в конструкторе вашего контекста есть что-то вроде:

public DataContext()
{
    this.Configuration.AutoDetectChangesEnabled = false;
}

В этом случае EF не обнаружит изменение навигациисвойство newItem.CreatedBy после добавления нового элемента в контекст.(SaveChanges обнаружит это последнее изменение, если обнаружение изменений не отключено.)

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

using (var ctx = new DataContext())
{
    ctx.Users.Attach(existingUser);

    // create item and add to context
    var newItem = new MyItem();

    // set related entity
    newItem.CreatedBy = existingUser;

    ctx.MyItems.Add(newItem);

    ctx.SaveChanges();
}

Это должно работать с автоматическим обнаружением изменений и без него.

0 голосов
/ 09 августа 2011

Попробуйте:

using (var ctx = new DataContext())
{
    ctx.Users.Attach(existingUser);

    // create item and add to context
    var newItem = new MyItem();
    ctx.MyItems.Add(newItem);

    // set related entity
    newItem.CreatedBy = existingUser;

    // Added
    ctx.ObjectStateManager.ChangeObjectState(newItem.CreatedBy, EntityState.Added);

    ctx.SaveChanges();
}

Если это не сработает, измените строку на:

ctx.ObjectStateManager.ChangeObjectState (newItem.CreatedBy, EntityState.Modified);

Добавлена ​​1 строка ... Надеюсь, это поможет.

...