2017-03-12 7 views
2

私はUWPでEFコアとSQLiteを使用しています。私はDbContext.Database.Migrate()を呼び出すことによって移行しようとしましたが、私はいつもMicrosoft.Data.Sqlite.SqliteException: 'SQLite Error 1: 'table "Tags" already exists'.'を取得します。Entity FrameworkコアとSQLiteを使用してDBを移行するときにテーブルが既に存在する

私はbin/debugフォルダをチェックしたのでテーブルが存在しないと確信していますが、データベースファイルはありません。私が間違ったフォルダをチェックしても、問題はないはずですか?
私はMigrationsフォルダを何回も削除しましたが、これがこの例外の原因ではないと思います。

これはDbContextコードです。

public class AppDbContext : DbContext 
{ 
    public DbSet<Word> Words { get; set; } 
    public DbSet<WordMeaning> WordMeanings { get; set; } 
    public DbSet<Tag> Tags { get; set; } 
    public DbSet<WordTag> WordTags { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlite("Data Source=Vocabulary.db"); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     // PK declaration 
     modelBuilder.Entity<Word>() 
      .HasKey(w => w.Text); 
     modelBuilder.Entity<WordMeaning>() 
      .HasKey(wm => new { wm.WordText, wm.WordClass }); 
     modelBuilder.Entity<Tag>() 
      .HasKey(t => t.Name); 
     modelBuilder.Entity<WordTag>() 
      .HasKey(wt => new { wt.WordText, wt.TagName }); 

     // relation declaration 
     modelBuilder.Entity<Word>() 
      .HasMany(w => w.WordMeanings) 
      .WithOne(wm => wm.Word) 
      .HasForeignKey(wm => wm.WordText) 
      .IsRequired() 
      .OnDelete(DeleteBehavior.Cascade); 

     modelBuilder.Entity<WordTag>() 
      .HasOne(wt => wt.Tag) 
      .WithMany(t => t.WordTag) 
      .HasForeignKey(wt => wt.TagName); 
     modelBuilder.Entity<WordTag>() 
      .HasOne(wt => wt.Word) 
      .WithMany(w => w.WordTag) 
      .HasForeignKey(wt => wt.WordText); 
    } 
} 

およびすべてのモデルコード。

public class Tag 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public List<WordTag> WordTag { get; set; } 
} 
public class Word 
{ 
    public string Text { get; set; } 
    public WordClass WordClasses { get; set; } 
    public DateTime AddedDate { get; set; } 
    public List<WordMeaning> WordMeanings { get; set; } 
    public List<WordTag> WordTag { get; set; } 
} 
public class WordMeaning 
{ 
    public string WordText { get; set; } 
    public string Definition { get; set; } 
    public string Example { get; set; } 
    public WordClass WordClass { get; set; } 
    public Word Word { get; set; } 
} 
public class WordTag 
{ 
    public Word Word { get; set; } 
    public Tag Tag { get; set; } 
    public string WordText { get; set; } 
    public string TagName { get; set; } 
} 
+1

あなたのユーザーフォルダを確認しましたか? W10の 'C:\ user \ username'と同じです。 –

答えて

1

@Gertアーノルドは、あなたのSQLiteデータベースファイル(Vocabulary.db)は、デフォルトでLocalFolder上で作成しなければならない、と述べました。データベースTagが既にC:\Users\{username}\AppData\Local\Packages\{your app package name}\LocalState)に作成されていることがわかります。あなたのプロジェクトにPackage.appxmanifest->Packing->Package nameで見つかるパッケージ名。 uwpアプリケーションでのファイルアクセスの詳細については、Files, folders, and librariesを参照してください。

また、uwpを使用したエンティティフレームワークの詳細については、UWP - New Databaseを参照してください。

+0

ありがとうございました。* .dbを削除でき、Migrate()はもはや例外をスローしませんでした。 – witoong623

関連する問題