2017-02-01 29 views
0

私が最初にSQLiteのEntityFramework 6コードでthis questionを実装しようとしています。私はデータベースを作成することができますが、ファイルはありますが空ですが、データベースにエントリを追加しようとすると、そのようなテーブルはありません。しかし、テーブルを手動で作成しようとすると(db.Database.ExecuteSqlCommand("CREATE TABLE etc.))、テーブルがすでに存在することがわかります。SQLiteの

私はこれについて既にいくつかの質問を見つけましたが、絶対的なものではないパスに関するものですが、ここではそうではありません。 EF6のためのSQLiteプロバイダは、コードファースト/移行のワークフローをサポートしていないので、手動で作成する必要があります

コンテキスト

//Context: 
class MediaContext : DbContext 
{ 
    public DbSet<MediaModel> Media { get; set; } 

    public MediaContext(string filename): base(new SQLiteConnection() { 
     ConnectionString = 
      new SQLiteConnectionStringBuilder() 
      { DataSource = filename, ForeignKeys = false } 
      .ConnectionString 
    }, true) 
    { 

    }   
} 

DAL

//In the DAL: 
public DataAccessLayer(string path) 
{ 
    _path = Path.GetFullPath(path); //<--The path already comes full in, I'm just paranoid at this point. 
    _connectionPath = _path + @"\MyDatabase.sqlite"; 

    using (var db = new MediaContext(_connectionPath)) 
    { 
     db.Database.CreateIfNotExists(); 
     db.Database.Initialize(false);     

     db.SaveChanges(); 
    } 

    public void Generate() 
    { 
     using (var db = new MediaContext(_connectionPath)) 
     { 
      db.Media.Add(new MediaModel("test")); 
      db.SaveChanges(); //<--SQLiteException: SQL logic error or missing database: no such table: MediaModels 

     } 
    } 

app.configを

//App.config: 
<configuration> 
    <configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v13.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    <providers> 
     <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
    <system.data> 
    <DbProviderFactories> 
     <remove invariant="System.Data.SQLite.EF6" /> 
     <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> 
     <remove invariant="System.Data.SQLite.EF6" /> 
     <add name="SQLite Data Provider" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /> 
    </DbProviderFactories> 
    </system.data> 
</configuration> 
+0

これは私の問題で変わっていません。 :/ –

+0

SQLite Browserアプリケーションを使用して、テーブルが実際に存在するかどうか、正しいスキーマがあるかどうかを確認してください。 –

+0

メモ帳でファイルを開くと、完全に空です(0kB)。私はかつてそれを何とか作成していましたが、私はもうこれを再現することができません(私はそれを確認できません)。それからそれは8kBを持っていて、たくさんのNUL文字で満たされました。だから私はテーブルの作成と保存の問題だと思うが、私は手動で作成することはできません質問に記載されているように。 –

答えて

2

ErikEJと同様に、SQLiteはコードを最初にサポートしていないと私はそれを使用していますが、明らかに厳密な名前付けポリシーを持っています。

すべての作業をするには、手動でテーブルを作成し、コンテキストをネーミングスキーマ(Media =>MediaModels)に適合させる必要がありました。

コンテキスト

public DbSet<MediaModel> MediaModels { get; set; } 

DAL

public DataAccessLayer(string path) 
{ 
    _path = Path.GetFullPath(path); 
    _connectionPath = _path + @"\MyDatabase.sqlite"; 

    using (var db = new MediaContext(_connectionPath)) 
    { 
     db.Database.ExecuteSqlCommand("CREATE TABLE IF NOT EXISTS 'MediaModels' ('Name' TEXT, 'FilePath' TEXT NOT NULL PRIMARY KEY, 'Tags' TEXT, 'Note' TEXT, 'FileExtension' TEXT)"); 

     db.SaveChanges(); 
    } 
} 

public void Generate() 
{ 
    using (var db = new MediaContext(_connectionPath)) 
    { 
     db.MediaModels.Add(new MediaModel("test")); 
     db.SaveChanges(); 
    } 
} 

このコードはまだ完璧ではない、と私は、私はそれを改善するとして、この答えを更新しようとするでしょう。

4

あなたのEF6ワークフローの外にあるデータベース。

+0

私はこれを試みました。答えとしてあなたのコメントをチェックしましたが、今はファイルにデータがありますが、それは通常のクエリで満たされているようですが、まだEF6で使用することはできません。以前と同じエラーがあります: "そのようなテーブルはありません:MediaModels"。私に迷惑をかけているのは、どこにいても "MediaModels"テーブルを求めているということです。私の文脈に何か問題がありますか? –

+1

流暢なマッピングapiまたはテーブル属性を使用して、コンテキスト内で明示的にテーブル名を指定する必要があります – ErikEJ