【问题标题】: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 查询之前强制创建数据库/表?

【问题讨论】:

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


    【解决方案1】:

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

     Context.Database.CreateIfNotExists();
    

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

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

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

    EF Code first migrations

    Database.SetInitializer
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      相关资源
      最近更新 更多