Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 迁移“遗留”SQLite数据库以使用实体框架时的主要关键问题_C#_.net_Sql_Entity Framework_Sqlite - Fatal编程技术网

C# 迁移“遗留”SQLite数据库以使用实体框架时的主要关键问题

C# 迁移“遗留”SQLite数据库以使用实体框架时的主要关键问题,c#,.net,sql,entity-framework,sqlite,C#,.net,Sql,Entity Framework,Sqlite,我最近开始了一个已经运行了几年的项目。应用程序是用c编写的,使用Windows窗体作为UI,使用SQLite作为数据库。当前使用ADO.NET通过System.Data.SQLite命名空间访问数据库 客户机不时会收到应用程序和数据库更新,但不是一次收到所有更新,因此存在大量结构不同的数据库版本。更糟糕的是,客户端可以将自己的字段添加到应用程序的表中,以启用自定义报告等。因此,不同数据库的数量无法控制。功能增强后,添加了越来越多的if-then-else代码,以使应用程序能够针对所有这些数据库变

我最近开始了一个已经运行了几年的项目。应用程序是用c编写的,使用Windows窗体作为UI,使用SQLite作为数据库。当前使用ADO.NET通过System.Data.SQLite命名空间访问数据库

客户机不时会收到应用程序和数据库更新,但不是一次收到所有更新,因此存在大量结构不同的数据库版本。更糟糕的是,客户端可以将自己的字段添加到应用程序的表中,以启用自定义报告等。因此,不同数据库的数量无法控制。功能增强后,添加了越来越多的if-then-else代码,以使应用程序能够针对所有这些数据库变体运行

此外,SQLite还有一个恼人的特性,即字段中的值可以存储为任何类型,而不仅仅是表create语句中定义的类型。从Excel的CSV文件中导入数据是很常见的,这些文件的日期/时间值不正确,SQLite很乐意导入,但在代码中,我们会遇到各种无效类型的异常

我想阻止这一切

为了清理数据库,我正在倡导一种标准的数据库设计,除非我们发布一个官方的更新以及自动迁移数据的代码,否则这种设计不会改变

我采用了最新的特别设计,在不更改表和字段名称的情况下,通过确保为现有字段定义主键并使用一致的类型,使其至少对实体框架友好

我现在正试图一个接一个地迁移各种遗留数据库。我正在使用一种技术,使用[LEGACY_table]中的SELECT*加载每个表中的所有记录;以及使用新的EF_表{ID=GetValuedr,ID,Description=GetValuedr,Description,};创建新的实体框架对象;。我已经定义了GetValue来处理格式错误的数据和DBNull引用等的转换

我现在的主要问题是,许多表的主键定义为INTEGER primary KEY AUTOINCREMENT NOT NULL,这将不允许实体框架从遗留数据库分配当前键值

在迁移过程中,我需要确保主键保持不变,因为没有定义外键关系,并且现有主键值存储在数据库之外的应用程序配置数据中

我四处寻找解决方案,但没有找到。我本以为这类问题——现有SQLite数据库的迁移和/或清理——已经解决了


有人能给我指出一个有效的方向来解决这个问题吗?

嗯,解决这个问题很简单

事实证明,edmx文件中实体框架定义的主键具有自动增量主键的属性StoreGeneratedPattern=Identity。通过将值更改为StoreGeneratedPattern=None,实体框架允许通过简单的代码赋值来更新主键

例如,当我有这个表定义时:

CREATE TABLE "FM_Location" (
    [ID] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    [Location] TEXT
);
然后在edmx文件中定义以下EntityType元素:

<EntityType Name="FM_Location">
    <Key>
        <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="integer" Nullable="false"
            StoreGeneratedPattern="Identity" />
    <Property Name="Location" Type="nvarchar" />
</EntityType>
我将标识更改为“无”,如下所示:

<EntityType Name="FM_Location">
    <Key>
        <PropertyRef Name="ID" />
    </Key>
    <Property Name="ID" Type="integer" Nullable="false"
            StoreGeneratedPattern="None" />
    <Property Name="Location" Type="nvarchar" />
</EntityType>
我对所有的自动递增字段都这样做了,我可以进行迁移