检查表是不是已在代码优先方法中创建
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
命令打开自动迁移。
该链接将提供有关用于高级数据库处理的数据库迁移的手动/受控方法的更多信息。链接中还描述了更简单的自动方法。
【讨论】:
以上是关于检查表是不是已在代码优先方法中创建的主要内容,如果未能解决你的问题,请参考以下文章
如何在maria DB中创建检查约束以检查char类型的多个值?