Code First - сохранение объекта без специализированного DbContext - PullRequest
2 голосов
/ 29 марта 2011

Code First - потрясающая функция. Но я не мог понять, как сохранить объект без предварительного создания специализированного DbContext. Это вообще возможно? Я хотел бы увидеть что-то вроде этого:

        var dbConn = new SqlCeConnection("Data Source=Test.sdf");
        using (var db = new DbContext(dbConn, true))
        {
            var cmp = new Company { CompanyName = "Microsoft" };
            db.Set(typeof(Company)).Add(cmp);
            var recordsAffected = db.SaveChanges();

            Console.WriteLine(
                "Saved {0} entities to the database, press any key to exit.",
                recordsAffected);
            Console.ReadKey();
        }

Можно ли динамически зарегистрировать класс для создания модели? Должен быть способ!

1 Ответ

1 голос
/ 29 марта 2011

Нет, я знаю, что нет никакой возможности создать DbContext без какой-либо информации о отображении. Специализированный контекст с предопределенными DbSets необходим для определения отображений и инициализации базы данных. Вероятно, вы можете использовать базовый DbContext, только если вы предоставляете информацию о отображении через его конструктор, передавая DbCompiledModel, созданный вручную перед использованием DbContext, но я еще не пробовал это.

Проблема в том, что DbSets и переопределенные OnModelCreating используются для определения необходимого отображения. Если у вас нет DbSets или OnModelCreating определено DbContext, вы не сможете сделать вывод и кэшировать сопоставления. Метаданные сопоставления создаются и компилируются только один раз для каждого типа контекста (до перезапуска приложения). Эта операция считается очень медленной. Если у вас нет определенного типа контекста, EF, вероятно, не сможет определить отображение, и даже если это возможно, возможно, потребуется создать и скомпилировать метаданные для каждого экземпляра контекста (например, для анонимных типов).

Если вы используете DbCompiledModel, созданный вручную, вы будете нести ответственность за его повторное использование.

...