我正在尝试在Ubuntu / Mono中使用SQLite(版本3.11)运行EF6 Code First。
Program.cs的:
static void Main(string[] args)
{
var db = new Context();
var user = new User() { Nome = "Teste"};
db.User.Add(user);
db.SaveChanges();
}
Context.cs:
public class Context : DbContext
{
public Context():base("Context")
{
Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<Context>());
}
public DbSet<User> User { get; set; }
}
User.cs:
[Table("User")]
public class User
{
[Key]
public int Id { get; set; }
public string Nome { get; set; }
}
每当它到达db.SaveChanges()时,它都会抛出以下异常:
System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> 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 function: last_rows_affected
at System.Data.SQLite.SQLite3.Prepare (System.Data.SQLite.SQLiteConnection cnn, System.String strSql, System.Data.SQLite.SQLiteStatement previous, System.UInt32 timeoutMS, System.String& strRemain) [0x0051b] in <2502d764dcbe41f1ad84e79b77538a55>:0
at System.Data.SQLite.SQLiteCommand.BuildNextCommand () [0x0007c] in <2502d764dcbe41f1ad84e79b77538a55>:0
--- End of inner exception stack trace ---
at System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update () [0x00080] in <ba0120930fe443a3b992bc3dba4c985a>:0
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.<Update>b__2 (System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator ut) [0x00000] in <ba0120930fe443a3b992bc3dba4c985a>:0
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update[T] (T noChangesResult, System.Func`2[T,TResult] updateFunction) [0x00063] in <ba0120930fe443a3b992bc3dba4c985a>:0
at System.Data.Entity.Core.EntityClient.Internal.EntityAdapter.Update () [0x00000] in <ba0120930fe443a3b992bc3dba4c985a>:0
at System.Data.Entity.Core.Objects.ObjectContext.<SaveChangesToStore>b__d () [0x00000] in <ba0120930fe443a3b992bc3dba4c985a>:0
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T] (System.Func`1[TResult] func, System.Data.Entity.Infrastructure.IDbExecutionStrategy executionStrategy, System.Boolean startLocalTransaction, System.Boolean releaseConnectionOnSuccess) [0x00064] in <ba0120930fe443a3b992bc3dba4c985a>:0
--- End of inner exception stack trace ---
有谁知道为什么会这样?
更新
我设法找出发生了什么。看起来创建的数据库是只读的。我所要做的只是改变它的权限而且它有效!
答案 0 :(得分:2)
我们设法解决了这个问题!
我们所做的是下载SQLite的完整源代码(sqlite-netFx-full-source-1.0.104.0.zip)并重新编译SQLite.csproj和EF6.csproj以使用以下命令不使用InteropDll并指定其平台:
xbuild /p:Configuration=Release /p:UseInteropDll=false /p:UseSqliteStandard=true System.Data.SQLite/System.Data.SQLite.2010.csproj
xbuild /p:Configuration=Release System.Data.SQLite.Linq/System.Data.SQLite.EF6.2010.csproj /p:Platform=x64
在项目中包括两个dll,以及Entity的dll。
然后我们更新了app.config:
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<connectionStrings>
<add name="Context" connectionString="data source=teste.s3db;" providerName="System.Data.SQLite.EF6" />
</connectionStrings>
<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, Version=1.0.104.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
</DbProviderFactories>
</system.data>
<entityFramework>
<providers>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6, Version=1.0.104.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
</providers>
</entityFramework>
</configuration>