Entity Framework 6 Создать() vs new

В чем разница между добавлением сущности этими двумя способами?

MyEntity me = new MyEntity();
entities.myentities.Add(me);

против

MyEntity me = entities.myentities.Create();

Должен ли я добавить "я" во втором примере? Если да, есть ли какое-то преимущество, так или иначе?

Большое спасибо!

Ответ 1

MyEntity me = new MyEntity();

создаст новый экземпляр MyEntity

MyEntity me = entities.myentities.Create();

создаст экземпляр с прокси-сервером MyEntity (при условии, что ваш контекст настроен для создания прокси)

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

отсюда

Ответ 2

Да, вам все равно нужно добавить его. Из документации метода Create:

Создает новый экземпляр объекта для типа этого набора. Обратите внимание, что этот экземпляр НЕ добавляется или не присоединяется к набору.

Ответ 3

MyEntity me = new MyEntity();

равно

MyEntity me = entities.myentities.Create();

Оба из вышеперечисленных создают новый экземпляр MyEntity, но не присоединяют его к DbSet, представленному myentities.

Линия

entities.myentities.Add(me)

прикрепляет экземпляр к DbSet, хотя вы также можете использовать Attach(me).

Во втором примере требуется "me", поскольку вы создадите экземпляр объекта без ссылки для хранения объекта.

Ответ 4

Если вы используете наследование объекта, вы можете добиться хорошего поведения полиморфизма с помощью метода Create(), поскольку он всегда создает правильную Entity (не общую). Пример:

public DbSet GetDialDbSet(DialEnum type)
    {
        DbSet ret;
        switch (type)
        {
            default:
            case DialEnum.MAPPING_REASON:
                ret = DialMappingReasons; 
                break;

            case DialEnum.PROCESSING_INFORMATION:
                ret = DialProcessingInformation;
                break;
        }
        return ret;
    }

и использование полиморфизма:

 DialDerived entity = (DialDerived) Db.GetDialDbSet(type).Create()