C# 实体框架6数据库优先和SQLite复合外键
我有一个包含两个表的sqlite数据库,定义如下:C# 实体框架6数据库优先和SQLite复合外键,c#,sqlite,entity-framework-6,system.data.sqlite,C#,Sqlite,Entity Framework 6,System.data.sqlite,我有一个包含两个表的sqlite数据库,定义如下: CREATE TABLE LocalQuotation ( Id TEXT , Name TEXT NOT NULL , Author TEXT NOT NULL , Customer TEXT , RUA TEXT , ProjectName TEXT , CreationDate TIMESTAMP NOT NULL , LastUpdateDate TIMESTAMP NOT NULL , LastEd
CREATE TABLE LocalQuotation (
Id TEXT
, Name TEXT NOT NULL
, Author TEXT NOT NULL
, Customer TEXT
, RUA TEXT
, ProjectName TEXT
, CreationDate TIMESTAMP NOT NULL
, LastUpdateDate TIMESTAMP NOT NULL
, LastEditor TEXT NOT NULL
, Reviewer TEXT
, CacheData BLOB NOT NULL
, Status INTEGER NOT NULL
, Version INTEGER
, PRIMARY KEY (Id, Version)
);
CREATE TABLE LocalParameter (
Name TEXT
, Data BLOB NOT NULL
, RefQuotation TEXT
, QuotationVersion INTEGER
, PRIMARY KEY (Name, RefQuotation, QuotationVersion)
, FOREIGN KEY (RefQuotation, QuotationVersion) REFERENCES LocalQuotation(Id, Version)
);
我试图首先将这些表映射到Entity Framework 6数据库,但出现以下错误:
- 错误6035:关系“FK_LocalParameter_0_0”的列 不是表的主键侧的表键的一部分 关系这种关系被排除在外
- 错误6035:关系“FK\u LocalParameter\u 0\u 1”中的列 不是表的主键侧的表键的一部分 关系这种关系被排除在外
localquote
的主键中
这是EF6的错误还是我看不出来的一个小错误
编辑
当我的外键位于单个列上时,一切都能正常工作,因此我认为这不是配置问题,但以下是我实际使用的软件包:
<package id="EntityFramework" version="6.1.3" targetFramework="net452" />
<package id="EntityFramework.fr" version="6.1.3" targetFramework="net452" />
<package id="System.Data.SQLite" version="1.0.103" targetFramework="net452" />
<package id="System.Data.SQLite.Core" version="1.0.103" targetFramework="net452" />
<package id="System.Data.SQLite.EF6" version="1.0.103" targetFramework="net452" />
<package id="System.Data.SQLite.Linq" version="1.0.103" targetFramework="net452" />
和配置文件:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v11.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
<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" />
<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="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
我不确定这是否会导致您的问题,但对于主键来说,文本字段是不好的选择,因为它们的存储方式以及可能需要比较多少数据才能达到相等。在MicrosoftSQLServer(我知道它不是SQLite)中,甚至不允许使用文本类型PK。确保SQLite确实将Id设置为主键字段。即使是这样,如果您使用identity int或GUID列,也可能会让EF玩得更好。我知道文本不是PK的最佳选择,但在我的情况下,这不是问题^^。是的,SQLite确实将文本设置为PK,因为在我添加版本作为PK的一部分之前,它一直在工作。我遇到了完全相同的问题,你有没有找到解决方案?@KimBayAndersen不幸的是,我不在这个问题发生时我工作过的公司工作,我不记得我选择了哪种解决方案……我想我没有找到一个好的解决方案,否则我会在这里提交。我的猜测是,我保留一个FK,并对其他列使用唯一约束,以确保每个条目的唯一性。对不起,我帮不了你多少忙。