C# 在MySQL和SQLite之间转换时,blob会被改变吗?

C# 在MySQL和SQLite之间转换时,blob会被改变吗?,c#,mysql,sqlite,entity-framework-6,C#,Mysql,Sqlite,Entity Framework 6,为数据库的开始做好准备(请不要问我们为什么要这样做^^): 我们的应用程序有两个SQLite数据库(我们称它们为Cache和LocalRepository)。这两个数据库是加密的(这是连接字符串;数据源=%PATH\u TO\u文件;%Password=%PWD%)。出于某些原因,我们将缓存数据库存储到本地存储库中。出于其他原因,我们正在将LocalRepository与MySQL数据库同步(我们称之为GlobalRepository) 只要应用程序从本地存储库中提取缓存数据库,我就可以重新创建

为数据库的开始做好准备(请不要问我们为什么要这样做^^):

我们的应用程序有两个SQLite数据库(我们称它们为
Cache
LocalRepository
)。这两个数据库是加密的(这是连接字符串;
数据源=%PATH\u TO\u文件;%Password=%PWD%
)。出于某些原因,我们将
缓存
数据库存储到
本地存储库
中。出于其他原因,我们正在将
LocalRepository
与MySQL数据库同步(我们称之为
GlobalRepository

只要应用程序从
本地存储库
中提取
缓存
数据库,我就可以重新创建文件并成功连接到它。但是如果应用程序使用来自
GlobalRepository
的数据更新
LocalRepository
,我会得到以下错误:

数据库磁盘映像格式不正确

这三个数据库通过Entity Framework 6进行映射,以下是所有数据库的定义方式:

LocalRepository定义(SQLite):

GlobalRepository定义(MySQL):

保存到本地存储库:

var cacheBytes = File.ReadAllBytes(cacheDatabaseFilePath);
var localRep = new LocalRepository
{
    [..]
    CacheData = cacheBytes,
    [..]
};
localRepositoryContext.Add(localRep);
localRepositoryContext.SaveChanges();
var localRep.Status = Status.Pushed;
var globalRep = new GlobalRepository
{
    [..]
    CacheData = localRep.CacheData,
    Status = localRep.Status,
    [..]
};
globalRepositoryContext.Add(localRep);

var saving = new Task[]
{
    globalRepositoryContext.SaveChangesAsync(),
    localRepositoryContext.SaveChangesAsync()
};

await Task.WhenAll(saving);
var globalRep = globalRepositoryContext.Find(id);
var localRep = new LocalRepository
{
    [..]
    CacheData = globalRep.CacheData,
    [..]
};
localRepositoryContext.Add(localRep);
localRepositoryContext.SaveChanges();
正在推送到GlobalRepository:

var cacheBytes = File.ReadAllBytes(cacheDatabaseFilePath);
var localRep = new LocalRepository
{
    [..]
    CacheData = cacheBytes,
    [..]
};
localRepositoryContext.Add(localRep);
localRepositoryContext.SaveChanges();
var localRep.Status = Status.Pushed;
var globalRep = new GlobalRepository
{
    [..]
    CacheData = localRep.CacheData,
    Status = localRep.Status,
    [..]
};
globalRepositoryContext.Add(localRep);

var saving = new Task[]
{
    globalRepositoryContext.SaveChangesAsync(),
    localRepositoryContext.SaveChangesAsync()
};

await Task.WhenAll(saving);
var globalRep = globalRepositoryContext.Find(id);
var localRep = new LocalRepository
{
    [..]
    CacheData = globalRep.CacheData,
    [..]
};
localRepositoryContext.Add(localRep);
localRepositoryContext.SaveChanges();
从GlobalRepository更新:

var cacheBytes = File.ReadAllBytes(cacheDatabaseFilePath);
var localRep = new LocalRepository
{
    [..]
    CacheData = cacheBytes,
    [..]
};
localRepositoryContext.Add(localRep);
localRepositoryContext.SaveChanges();
var localRep.Status = Status.Pushed;
var globalRep = new GlobalRepository
{
    [..]
    CacheData = localRep.CacheData,
    Status = localRep.Status,
    [..]
};
globalRepositoryContext.Add(localRep);

var saving = new Task[]
{
    globalRepositoryContext.SaveChangesAsync(),
    localRepositoryContext.SaveChangesAsync()
};

await Task.WhenAll(saving);
var globalRep = globalRepositoryContext.Find(id);
var localRep = new LocalRepository
{
    [..]
    CacheData = globalRep.CacheData,
    [..]
};
localRepositoryContext.Add(localRep);
localRepositoryContext.SaveChanges();
重新创建缓存:

File.WriteAllBytes(cacheFilePath, localRep.CacheData);
总而言之:只有当缓存数据来自
GlobalRepository
时,最后一个操作才会复制到磁盘更改的字节。事实上,重新创建的
缓存与原始文件相比非常小(64 KB vs 1,7 MB)


在哪里可以更改字节?由于它是系统性的,我猜问题与MySQL与SQLite相比存储字节的方式有关。

您是否检查了最后一段代码中的
globalRep.CacheData
是否完整?我猜某些对象不是字节数组,因此不会写入实际的blob内容。但我无法看到这里涉及的所有类型。请注意,我忘了添加推送到GlobalRepository。还要添加EF6生成的实体。@GertArnold:您是正确的,globalRep.CacheData在从GlobalRepository更新的
阶段是不完整的。我只是检查一下,MySQL中的blob类型有一个限制。。。64KB()。。。我不知道那件事。。。