检查表是不是已在代码优先方法中创建

Posted

技术标签:

【中文标题】检查表是不是已在代码优先方法中创建【英文标题】:check if table has been created in code first approach检查表是否已在代码优先方法中创建 【发布时间】:2013-09-24 04:33:25 【问题描述】:

我正在使用 Entity Framework 的代码优先方法创建表,我需要检查数据库中是否有需要删除的实体:

class MyDocument

    public string Id  get; set; 
    public string Text  get; set; 


class MyContext : DbContext

    public DbSet<MyDocument> Documents  get; set; 



using (var data = new MyContext())

    var present = from d in data.Documents
                  where d.Id == "some id" || d.Id == "other id"
                  select d;
    // delete above documents

在第一次运行时,当还没有表时,上面的 LINQ 表达式会抛出异常:

Invalid object name 'dbo.Documents'

如何检查表是否存在,如果不存在,则将present 设置为空集,也许?或者也许有一种方法可以在我发出 LINQ 查询之前强制创建数据库/表?

【问题讨论】:

【参考方案1】:

EF 实际上会根据它所连接的数据库检查整个上下文。 数据库可以有更多的上下文。但也不少。 所以实际上你检查了

 Context.Database.CreateIfNotExists();

如果数据库和上下文不匹配并且您正在使用自动迁移,那么您会收到特定对象错误。但这在 EF 如何处理上下文与 DB 比较方面可能会产生误导。

您当然可以尝试访问上下文中的每个 DBSet 不过不确定这有多大用处。

EF 代码首先支持自动或按需迁移。

见EF Code first migrations

Database.SetInitializer

例如使用SetInitializer 命令打开自动迁移。

该链接将提供有关用于高级数据库处理的数据库迁移的手动/受控方法的更多信息。链接中还描述了更简单的自动方法。

【讨论】:

以上是关于检查表是不是已在代码优先方法中创建的主要内容,如果未能解决你的问题,请参考以下文章

在 hive 的外部表中创建分区

如何在maria DB中创建检查约束以检查char类型的多个值?

如何在 Python 中创建唯一值优先级队列?

如何检查表是不是已在 Laravel 查询生成器中加入

如何通过VBscript检查MS Access中是不是存在表

在 django 中创建原子事务是不是会自动创建锁