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();
}
是否可以动态注册类以进行模型创建?一定有办法!
答案 0 :(得分:1)
不,我知道如果没有任何有关映射的信息,则无法创建DbContext
。具有预定义DbSets的专用上下文是定义映射和数据库初始化所必需的。只有在使用DbCompiledModel
之前通过传递手动创建的DbContext
提供有关通过其构造函数进行映射的信息时,才可以使用基本DbContext,但我还没有尝试过。
问题是DbSets和overriden OnModelCreating
用于推断所需的映射。如果您没有DbSet或OnModelCreating
已定义DbContext
无法推断和缓存映射。映射元数据仅针对每种上下文类型创建和编译一次(直到应用程序重新启动)。此操作被认为非常慢。如果您没有特定的上下文类型,EF可能无法推断映射,即使它可能也可能需要为每个上下文实例创建和编译元数据(如匿名类型)。
如果您使用手动创建的DbCompiledModel
,则您有责任重复使用它。