【问题标题】:EF 4.1 Code First creating tables on SQL Server 2008EF 4.1 Code First 在 SQL Server 2008 上创建表
【发布时间】:2012-01-24 19:06:35
【问题描述】:

我在 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 约定中。

我已经创建了数据库和一个用户,该用户是该数据库的所有者,但该用户没有删除或创建数据库的权限。

有谁知道可能是什么问题?

【问题讨论】:

    标签: asp.net-mvc-3 sql-server-2008 entity-framework-4.1


    【解决方案1】:

    我已经创建了数据库,并且拥有一个用户 该数据库,但用户无权删除或创建 一个数据库。

    这就是问题所在。所有内置初始化程序仅支持数据库不存在的情况。如果数据库存在,您的初始化程序认为它还包含表并查找 EdmMetadata 表以将当前模型散列与存储的散列进行比较。

    您需要删除数据库并让您的应用程序创建它,或者您必须使用仅允许在现有数据库中创建表来构建自定义初始化程序(如果您需要任何数据库更新,您也必须实现该逻辑)-here是一些例子。

    【讨论】:

      【解决方案2】:

      DropCreateDatabaseIfModelChanges更改为DropCreateDatabaseAlways并运行一次,然后再改回来

      听起来模型没有更改,但表或其他内容已手动编辑或 EdmMetaData 表已删除

      哦!并确保这不是现场直播!这将删除并重新创建所有表,因此请确保您有一种用数据填充它们的好方法。

      【讨论】:

        【解决方案3】:

        初始化程序将尝试删除并重新创建数据库,但是就像您说的那样,不允许用户这样做。所以是的,你会得到错误。

        EF CodeFirst 尝试创建的表之一是 EdmMetadata 表 - 它基本上只是存储当前模型的哈希值,以帮助它检查模型是否已更改。由于您的数据库用户无法删除数据库,因此 EF 未初始化此表 - 因此出现错误。

        如果您使用的是现有数据库,则应像删除复数命名一样删除元数据表:

        builder.Conventions.Remove<IncludeMetadataConvention>();
        

        不过,一旦您这样做了,您对模型所做的任何更改都必须在数据库中手动进行。您必须想出一个策略,了解如何将数据库更改从开发机器迁移到生产环境。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多