我在SQL Server 2008 R2中使用EF 4.1 Code First。
我写了我的DbContext如下:
public class DataAccessContext : DbContext
{
public DbSet<TipoJob> TipoJobs { get; set; }
public DbSet<Usuario> Usuarios { get; set; }
public DbSet<Telefone> Telefones { get; set; }
public DbSet<Job> Jobs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
在global.asax中我初始化了它:
Database.DefaultConnectionFactory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["DataAccessContext"].ConnectionString);
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DataAccessContext>());
但我的表格没有被创建,我收到以下错误:
无法检查模型兼容性,因为模型中未包含EdmMetadata类型。确保已将IncludeMetadataConvention添加到DbModelBuilder约定中。
我已经创建了数据库,并且该用户是该数据库的所有者,但该用户无权删除或创建数据库。
有谁知道可能是什么问题?
答案 0 :(得分:2)
我已经创建了数据库,并且是一个用户 该数据库,但用户无权删除或创建 数据库。
这就是问题所在。所有内置初始化程序仅支持数据库不存在的情况。如果数据库存在,则初始化程序认为它还包含表并查找EdmMetadata
表以将当前模型散列与存储的散列进行比较。
您需要删除数据库并让应用程序创建它,或者您必须使用现有数据库中的表创建来构建自定义初始化程序(如果您需要任何数据库更新,您还必须实现该逻辑) - {{3是一些例子。
答案 1 :(得分:0)
将DropCreateDatabaseIfModelChanges
更改为DropCreateDatabaseAlways
并运行一次,然后将其更改回来
听起来模型没有被更改,但表格或其他东西是手动编辑的,或者EdmMetaData表已被删除
哦!并确保这不是现场!这将删除并重新创建所有表,因此请确保您有一个很好的方法来填充数据。
答案 2 :(得分:0)
初始化程序将尝试删除并重新创建数据库,但正如您所说,不允许用户使用。所以,是的,你会得到错误。
EF CodeFirst尝试创建的表之一是EdmMetadata表 - 它基本上只存储当前模型的哈希值,以帮助它检查模型是否已更改。由于您的数据库用户无法删除数据库,因此EF不会初始化此表 - 因此会出错。
如果您正在使用现有数据库,则应删除元数据表,方法与删除复数命名的方式相同:
builder.Conventions.Remove<IncludeMetadataConvention>();
完成此操作后,您必须在数据库中手动对模型进行任何更改。您必须提出一个策略,了解如何将数据库更改从开发计算机迁移到生产环境中。