11


7

モデルが変更されていなくても、EF4がデータベースを再作成しようとするのはなぜですか?

SQL Server CE 4.0を使用するASP.NET MVC 3 Beta Webサイトがあります。 ScottGuのNerdDinnerの例と自分のコードの両方で、私は時々データベースにアクセスしようとするとすぐに次の例外が発生します。

File already exists. Try using a different database name.
[ File name = D:\Sourcecode\NerdDinner\NerdDinner\App_Data\NerdDinners.sdf ]

Line 17:         public ActionResult Index()
Line 18:         {
Line 19:             var dinners = from d in nerdDinners.Dinners
Line 20:                           where d.EventDate > DateTime.Now
Line 21:                           select d;

[SqlCeException (0x80004005): File already exists. Try using a different database name. [ File name = D:\Sourcecode\NerdDinner\NerdDinner\App_Data\NerdDinners.sdf ]]
   System.Data.SqlServerCe.SqlCeEngine.ProcessResults(IntPtr pError, Int32 hr) +92
   System.Data.SqlServerCe.SqlCeEngine.CreateDatabase() +1584
   System.Data.SqlServerCe.SqlCeProviderServices.DbCreateDatabase(DbConnection connection, Nullable`1 timeOut, StoreItemCollection storeItemCollection) +287
   System.Data.Objects.ObjectContext.CreateDatabase() +84
   System.Data.Entity.Internal.DatabaseOperations.Create(ObjectContext objectContext) +35
   System.Data.Entity.Infrastructure.Database.Create() +70
   System.Data.Entity.Infrastructure.CreateDatabaseOnlyIfNotExists`1.InitializeDatabase(TContext context) +360
   System.Data.Entity.Infrastructure.Database.Initialize() +272
   System.Data.Entity.Internal.InternalContext.Initialize() +90
   System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +34
   System.Data.Entity.Internal.Linq.EfInternalQuery`1.Initialize() +140
   System.Data.Entity.Internal.Linq.EfInternalQuery`1.get_Provider() +29
   System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() +34
   System.Linq.Queryable.Where(IQueryable`1 source, Expression`1 predicate) +63
   NerdDinner.Controllers.HomeController.Index() in D:\Sourcecode\NerdDinner\NerdDinner\Controllers\HomeController.cs:19

既存の.dbfファイルでこれが機能する場合と、問題が発生する場合がある理由を理解できません。 私も明示的にデフォルトの動作を設定しようとしました

Database.SetInitializer(new CreateDatabaseOnlyIfNotExists<...>());

他の誰かがこれを経験しましたか?

  • Cassiniを再起動しても違いはないようです。

  • このエラーを受け取った後にIEで更新を押すと、正確になります 同じページが適切に読み込まれます

5 Answer


8


このような古い質問を復活させてすみませんが、今日私はこれを経験しており、古いバージョンのCTPのインストールを伴わない回避策を見つけました。

からブログ投稿の正しいURLはhttp://www.hanselman.com/blog/PDC10BuildingABlogWithMicrosoftUnnamedPackageOfWebLove.aspxです(ブログ投稿の約半分)

  • AppStart_SQLCEEntityFramework.csファイルに移動し、DefaultConnectionFactory行に以下を追加します。*

Database.DefaultConnectionFactory = new SqlCeConnectionFactory(
    "System.Data.SqlServerCe.4.0",
    HostingEnvironment.MapPath("~/App_Data/"),"");

私の特定のデータベースはApp_Dataフォルダーに配置されていますが、そうでない場合は、パスを適切に変更できるはずであり、機能するはずです。

お役に立てれば!


3


これは最近発見されたバグのようです。 MSDNフォーラム

回避策は、SQL Server CE 4.0 CTP 1を再インストールすることですhttp://www.microsoft.com/downloads/details.aspx?FamilyID=0D2357EA-324F-46FD-88FC-7364C80E4FDB [ダウンロード]


1


Microsoftサイトからダウンロード可能なSQL Server CE CTP1をインストールして使用します。 これで私の問題は解決しました。


1


今日、リリースされたMVC3とNuGetでダウンロードされたSQL Server CE 4.0で同じ問題が発生しましたが、行のコメントを外すことで解決しました。

    DbDatabase.SetInitializer(new CreateCeDatabaseIfNotExists());

そして、MyContextを、modelsフォルダー内のDBContextから継承していたコンテキストクラスに置き換えます。


0


最終的なSQL Compact Edition 4.0がリリースされ、インストール後、問題は発生しなくなりました。 チームブログからのお知らせは次のとおりです。