EF7 (Code First) + SQLite non crea un database e le tabelle per i modelli

entity-framework-core sqlite win-universal-app

Domanda

Sto attualmente cercando di ricreare l'esempio, fatto nella documentazione http://ef.readthedocs.org/en/latest/getting-started/uwp.html , usando EF7 e SQLite per creare un'app universale per piattaforma Windows.

Ho installato il pacchetto di comandi EF7 ed EF7 richiesto e ho creato il modello e il contesto:

 public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
            string dirPath = ApplicationData.Current.LocalFolder.Path;
            string connectionString = "Filename=" + Path.Combine(dirPath, "blogging.db");
            optionsBuilder.UseSqlite(connectionString);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

Il mio problema ora è che, dopo aver creato la soluzione, il comando che dovrebbe impalcare una migrazione per creare il set iniziale di tabelle per il mio modello fallisce con la seguente eccezione:

PM> Add-Migration MyFirstMigration
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
 at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
 at System.Reflection.RuntimeAssembly.get_DefinedTypes()
 at Microsoft.Data.Entity.Design.Internal.StartupInvoker..ctor(String startupAssemblyName, String environment)
 at Microsoft.Data.Entity.Design.DbContextOperations..ctor(ILoggerProvider loggerProvider, String assemblyName, String startupAssemblyName, String environment)
 at Microsoft.Data.Entity.Design.MigrationsOperations..ctor(ILoggerProvider loggerProvider, String assemblyName, String startupAssemblyName, String environment, String projectDir, String rootNamespace)
 at Microsoft.Data.Entity.Design.OperationExecutor.<>c__DisplayClass3_0.<.ctor>b__3()
 at Microsoft.Data.Entity.Internal.LazyRef`1.get_Value()
 at Microsoft.Data.Entity.Design.OperationExecutor.<AddMigrationImpl>d__7.MoveNext()
 at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
 at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
 at Microsoft.Data.Entity.Design.OperationExecutor.OperationBase.<>c__DisplayClass4_0`1.<Execute>b__0()
 at Microsoft.Data.Entity.Design.OperationExecutor.OperationBase.Execute(Action action)
Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Qualcuno ha una soluzione per questo problema? Grazie in anticipo

Risposta accettata

Nel mio caso la soluzione al problema era creare il database e le tabelle attraverso il codice nell'app.xaml, prima che l'app iniziasse.

using (var db = new BloggingContext())
{
    db.Database.EnsureCreated();
    db.Database.Migrate();
}

Contesto + Modello:

public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string path = ApplicationData.Current.LocalFolder.Path;
        if (!File.Exists(Path.Combine(path, "blogging.db")))
        {
            File.Create(Path.Combine(path, "blogging.db"));
        }
        optionsBuilder.UseSqlite("Data Source=" + Path.Combine(path, "blogging.db")+";");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Make Blog.Url required
        modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .IsRequired();
    }
}

[Table("Blog")]
public class Blog
{
    [Key]
    public int BlogId { get; set; }
    [MaxLength(100)]
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

[Table("Post")]
public class Post
{
    [Key]
    public int PostId { get; set; }

    [MaxLength(30)]
    public string Title { get; set; }
    [MaxLength(250)]
    public string Content { get; set; }

    public int BlogId { get; set; }
    [ForeignKey("BlogId")]
    public Blog Blog { get; set; }
}

Inoltre prima di accedere al database, cerco di averlo creato, ad es

 using (var db = new BloggingContext())
 {
     db.Database.EnsureCreated();
     Blogs.ItemsSource = db.Blogs.ToList();
 }


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché