代码优先 - 在没有专门的DbContext的情况下持久化对象

时间:2011-03-29 04:45:07

标签: entity-framework ef-code-first entity-framework-4.1

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 个答案:

答案 0 :(得分:1)

不,我知道如果没有任何有关映射的信息,则无法创建DbContext。具有预定义DbSets的专用上下文是定义映射和数据库初始化所必需的。只有在使用DbCompiledModel之前通过传递手动创建的DbContext提供有关通过其构造函数进行映射的信息时,才可以使用基本DbContext,但我还没有尝试过。

问题是DbSets和overriden OnModelCreating用于推断所需的映射。如果您没有DbSet或OnModelCreating已定义DbContext无法推断和缓存映射。映射元数据仅针对每种上下文类型创建和编译一次(直到应用程序重新启动)。此操作被认为非常慢。如果您没有特定的上下文类型,EF可能无法推断映射,即使它可能也可能需要为每个上下文实例创建和编译元数据(如匿名类型)。

如果您使用手动创建的DbCompiledModel,则您有责任重复使用它。