2016-02-10 17 views
6

C# .NET (4.5.2) WPF projemdeki Kod İlkesi yaklaşımını kullanarak, Entity Framework 6 ile çalışmak üzere System.Data.SQLite kullanmaya çalışıyorum.Varlık Framework 6 SQLite veritabanında tablo oluşturmuyor

Baktım ve aşağıdaki yerlerde (diğerlerinin yanı sıra) yönergeleri izlemeyi denedim, ancak bunların dışında, farklı bir dbms için, Kod İlk için değil, veya yukarıdaki bazı kombinasyonların dışında görünüyorlar. . aşağıdaki gibi

https://msdn.microsoft.com/en-us/data/jj592674

https://msdn.microsoft.com/en-us/data/jj592674.aspx

http://nullskull.com/a/10476742/sqlite-in-wpf-with-entity-framework-6.aspx

Entity Framework 6 + SQLite

Ben, nihayet App.config dosyası doğru kurulmamış var düşünüyorum:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <entityFramework> 
    <!-- from: https://stackoverflow.com/questions/14510096/entity-framework-6-sqlite --> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
     <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 
     <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 
    </providers> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="v11.0" /> 
     </parameters> 
    </defaultConnectionFactory> 
    </entityFramework> 
    <connectionStrings> 
    <add name="MyDatabase" connectionString="Data Source=.\DataFile\myDatabase.sqlite" providerName="System.Data.SQLite" /> 
    </connectionStrings> 
    <system.data> 
    <!-- from: https://stackoverflow.com/questions/14510096/entity-framework-6-sqlite --> 
    <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"/> 
     <add name="SQLite Data Provider" invariant="System.Data.SQLite" 
      description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /> 
    </DbProviderFactories> 
    </system.data> 
</configuration> 

Benim DBContext tanımı aşağıdaki gibidir:

public class DataItem 
{ 
    [Key] 
    public int MyInt { get; set; } 
    public string MyString { get; set; } 
} 

Ve ben böyle bir bağlam aramaya çalışıyorum:

public class MyDataContext : DbContext 
{ 
    public MyDataContext() : base("name=MyDatabase") 
    { 
    } 
    public DbSet<DataItem> DataItems { get; set; } 
} 

Benim Dataıtem sınıfı aşağıdaki gibidir I gibi

using (var db = new MyDataContext()) 
{ 
    DataItem item = new DataItem { MyInt = 19, MyString = "nineteen" }; 
    db.DataItems.Add(item); 
    try 
    { 
     db.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     var x = ex.InnerException; 
     Debug.WriteLine("Inner Exception: {0}", x); 
     throw; 
    } 

} 

bekliyorum, MyDataContext örneğini oluşturduğumda, myDatabase.sqlite dosya benim bin\debug\DataFile dizinimde oluşturulur. Ancak, db.SaveChanges()'u aramaya çalıştığımda, bir özel durum yakalanır. Ben veri dosyası dizininde baktığınızda

Bu istisnanın InnerException System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SQLite.SQLiteException: SQL logic error or missing database no such table: DataItems

olduğunu myDatabase.sqlite dosyası sıfır bayt. Bu bana, DbContext uygulamasının app.config dosyasındaki yeni veritabanı dosyası için uygun bir dosya adı bulmasına rağmen, kodun ilk olarak veritabanındaki tabloların oluşturulması gerektiği gibi yapılmadığını söyler.

Burada eksik olduğum belli bir şey var mı? Örneklerin hepsi bu (son derece kritik) adım çalışmalarını ve EF6'daki her şeyin düzgün çalışan bir veritabanından izlediğini varsayar.

Bu konuda bana herhangi bir yardım için şimdiden teşekkür ederiz.

+1

Yanıtı sildim çünkü yanlıştı, ancak şu soruyu buldu: http://stackoverflow.com/questions/22174212/entity-framework-6-with-sqlite-3-code-first-wont-create- görünüşte EF6 SQLite tabloları bozuldu. – Steve

+0

Ayrıca, SQLite veya MySQL kullanıyor musunuz? Hem farklı yerlerde referans olarak görünüyorsun. – Steve

+0

sqlite ... Üzgünüz, bunu birkaç kez MySQL olarak yanlış yazdım. Düzenlenen! –

cevap

4

Entity Framework 6 with SQLite 3 Code First - Won't create tables'a göre, EF6 SQLite ile kullanıldığında tablolar oluşturmuyor, bu yüzden kendim yapmak zorunda kaldım.

DB Browser for SQLite kullanarak bir SQLite veritabanı oluşturabiliyor ve tabloları kendim oluşturabiliyordum. Oluşturduğum tabloların yapısının Model sınıflarımdaki özelliklerle eşleştiğinden emin olmak ve Model alanlarındaki [Anahtar] açıklamasını kullanmak için, birincil alanın hangi alan olduğunu belirtmek için dikkatli olmalıydım.

Önemli olarak, Visual Studio'ya bu dosyayı kapmak ve Visual Studio'nun dosya hakkında bilgi sahibi olduğundan emin olmak için Varolan Öğeyi Ekleme gereği duydum.

Ayrıca, önemli olarak, bu dosyanın Özellikler bölümüne gitmeliydim ve 'Kopyalama Dizini'ne Kopyala' özelliğini 'Yeni Olduğunda Kopyala' olarak ayarladım, böylece veritabanı bin/debug veya bin/uygulamayı çalıştırdığımda serbest bırakma dizini.Bunu yapmadıysam, çalışma zamanı çökmesine neden olan veritabanı çalışma zamanında mevcut olmaz.

+2

buna ihtiyacınız var: https://github.com/msallin/SQLiteCodeFirst - bağlantılı soru üzerindeydi: https://stackoverflow.com/a/29460684/492 –