3

基本上,我有一个 LINQ 数据库上下文及其模型。通常,如果数据库不存在,我会在 SQL 上下文中创建数据库(上下文是单例,每次访问它时都会检查)。

如果我在第一次启动时将数据添加到数据库,一切都会运行良好。但是,如果我在应用程序的第一次启动期间不插入任何数据,那么在连续启动时我会得到

SqlCeException:指定的表不存在[TableName]

我不知道如何更具体地解释它,但是如果我在第一次启动时没有插入任何数据,那么每当我在应用程序的第二次启动时执行 LINQ 查询时,异常就会立即出现。如果我在第一次启动时插入了一些数据,那么在应用程序的剩余生命周期内一切都很好。为什么创建数据库并引入数据库上下文而不插入任何数据是一件坏事?

这是我的 LINQ DB 模型:

如果我在第一次启动时没有插入任何数据,这就是我在第二次启动时遇到异常的地方:

我还感到震惊的是,在 LINQ 中没有检查表是否存在的 API 调用,所以我不得不假设“这应该可以正常工作”——但事实并非如此。

有任何想法吗?谢谢!:)

更新:我验证了分析 .sdf 文件,如果我在第一次启动应用程序时不插入任何数据,确实没有创建表。照我看来:

  • 这是 LINQ-to-SQL 中的一个错误。如果没有表存在,它不应该崩溃,但知道它应该创建它们。或者处理这种情况,只在插入数据时才建表。
  • 我需要在第一次启动时总是在 SQL 中插入一些虚拟数据,或者......
  • 检查表是否存在,如果不存在,则通过强制 LINQ-to-SQL 创建它们来对其做出反应。但是怎么做?
4

1 回答 1

1

我也处理过这个问题,我已经这样解决了:

获取数据上下文:

dbDataContext = new DBDataContext(DBConnectionString);

if( dbDataContext.DatabaseExists() == true)

//然后尝试获取一个实体:

System.Data.Linq.Table<Entity> entities = dbDataContext.Tablename;

//尝试从实体中获取元素:

IEnumerator<Entity> enumEntity = entities.GetEnumerator();

entities.GetEnumerator();将始终引发异常“找不到表”。

只需使用 try/catch 并在 catch 范围内删除数据库并重新创建它,因为您的数据库无论如何都是空的:)

dbDataContext.DeleteDatabase();
dbDataContext.CreateDatabase();
dbDataContext.SubmitChanges();
于 2012-09-11T13:47:24.900 回答