Linq 如果我没有';t将数据插入数据库

Linq 如果我没有';t将数据插入数据库,linq,windows-phone-7,exception,sql-server-ce,Linq,Windows Phone 7,Exception,Sql Server Ce,基本上,我有一个LINQ数据库上下文及其模型。通常,如果数据库不存在,我会在SQL上下文中创建数据库(上下文是单例的,每次访问它时都会检查) 如果我在第一次启动时向数据库添加数据,一切都会正常工作。但是,如果我在应用程序的第一次启动时没有插入任何数据,那么在后续的发布中,我会得到 SqlCeException:指定的表不存在[TableName] 我不知道如何更具体地解释它,但如果我没有在第一次启动时插入任何数据,那么每当我在第二次启动应用时执行LINQ查询时,就会立即出现异常。如果我在第一次发

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

如果我在第一次启动时向数据库添加数据,一切都会正常工作。但是,如果我在应用程序的第一次启动时没有插入任何数据,那么在后续的发布中,我会得到

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

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

以下是我的LINQ DB模型:

如果在第一次启动时没有插入任何数据,则在第二次启动时会出现异常:

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

有什么想法吗?谢谢!:)

更新:我通过分析.sdf文件验证,如果在首次启动应用程序时不插入任何数据,则确实不会创建任何表。在我看来:

  • 这是LINQ to SQL中的一个bug。如果没有表,它不应该崩溃,但要知道它应该创建它们。或者只在插入数据时处理案例并创建表
  • 我需要总是在第一次启动时将一些虚拟数据插入SQL,或者
  • 检查表是否存在,如果不存在,则通过强制LINQ到SQL来创建它们来对其作出反应。但是怎么做呢
我也处理过这个问题,我用这种方式解决了它:

获取数据上下文:

dbDataContext = new DBDataContext(DBConnectionString);

if( dbDataContext.DatabaseExists() == true)
//然后尝试获取一个实体:

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

我做了一些挖掘。我从设备上下载了.sdf文件,并使用SQLCompactQueryAnalyzer对其进行了分析。事实上,如果我不插入任何数据,这些表就不会被创建为SQL,所以在第二次启动后会出现错误。如果我插入数据,那么表就在那里。我觉得奇怪的是,即使调用了CreateDatabase(),也没有表。我遗漏了什么?我不确定Linq to SQL在WP7中有何不同,但您可能需要在调用CreateDatabase后调用SubmitChanges。感谢您的建议,但我也尝试了,但没有任何帮助。如果在创建数据库后立即处理DataContext/关闭连接怎么办?我认为SQL CE可能没有刷新对文件的更改,因此它可能只是在内存中进行更改。非常感谢Vlad的回复!稍后我将尝试您的解决方案,但听起来似乎这会奏效!:)这听起来确实像是微软应该注意的一个bug…:-/太令人沮丧了。再次感谢!再次感谢,这解决了问题!不过,对我来说,这听起来像是Windows Phone 7.5上LINQ to SQL中的一个bug。对于古玩来说,这是我修复该问题的代码:
IEnumerator<Entity> enumEntity = entities.GetEnumerator();
dbDataContext.DeleteDatabase();
dbDataContext.CreateDatabase();
dbDataContext.SubmitChanges();