EdmGen.exe 不适用于 System.Data.SQLite 高于 1.0.94.0 的版本

EdmGen.exe won't work with a System.Data.SQLite version greater than 1.0.94.0

我一直在尝试设置 entity framework 和 System.Data.SQLite(针对 .NET 4.0)。我使用的是 Visual Studio 2017,所以我知道没有可用的设计时组件。

我偶然发现了这个手动设置所有内容的指南:https://liiw.blogspot.co.uk/2014/12/sqlite-entity-framework-database-first.html

不过,我将按照上面 link 中的说明总结一下我得到的结果:

一个文件夹,包含以下项目:

EdmGen.exe.config内容如下:

<configuration>
    <system.data>
        <DbProviderFactories>
            <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>

gen.bat内容如下:

EdmGen.exe /mode:fullgeneration /c:"Data Source=TestDatabase.sqlite" /provider:System.Data.SQLite /entitycontainer:TestDatabase /project:TestDatabase /language:CSharp

运行 gen.bat(或上面的命令),System.Data.SQLite 二进制文件是 System.Data.SQLite(或任何大于 1.0.94.0 的版本)的最新版本以下错误:

error 7001: The provider returned schema mapping information that is not valid.
        Schema specified is not valid. Errors:
StoreSchemaDefinition(2,65) : error 0175: The specified store provider cannot be found in the configuration, or is not valid.

它适用于 System.Data.SQLite 程序集的 1.0.94.0 版。

谷歌搜索错误并没有找到关于我遇到的问题的任何答案。我在这里做错了什么?

所以我去打开了 a ticket on system.data.sqlite.org 结果发现 EdmGen.exe 不支持 Entity Framework 6. 他们提供了以下用于生成对象的说明:

The EdmGen tool is apparently not compatible with EF6. Instead, you will want to use the legacy provider, which is System.Data.SQLite.Linq.

In the "EdmGen.exe.config" file, use:

<configuration>
    <system.data>
        <DbProviderFactories>
            <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" />
            <remove invariant="System.Data.SQLite.Linq" />
            <add name="SQLite Data Provider (LINQ)" invariant="System.Data.SQLite.Linq" description=".NET Framework Data Provider for SQLite (LINQ)" type="System.Data.SQLite.Linq.SQLiteProviderFactory, System.Data.SQLite.Linq" />
        </DbProviderFactories>
    </system.data>
    <system.diagnostics>
      <trace autoflush="true" indentsize="4">
        <listeners>
          <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TextWriterOutput.log" />
           <remove name="Default" />
         </listeners>
       </trace>
     </system.diagnostics>
</configuration>

And then in the "gen.bat" file:

EdmGen.exe /mode:fullgeneration /c:"Data Source=TestDatabase.sqlite" /provider:System.Data.SQLite.Linq /entitycontainer:TestDatabase /project:TestDatabase /language:CSharp

The "EdmGen.exe.config" file above will also generate a trace log file in the current directory, which may be useful in debugging. You can remove that section if you like.

不幸的是,我不知道有什么方法可以为 Entity Framework 6 生成对象,而且我对 Entity Framework 总体来说还很陌生,所以对Entity Framework6 和之前版本Entity Framework 的区别。尽管如此,希望这个答案对以后遇到这个问题的任何人都有用。