C# 在MySQL和SQLite之间转换时,blob会被改变吗?
为数据库的开始做好准备(请不要问我们为什么要这样做^^): 我们的应用程序有两个SQLite数据库(我们称它们为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) 只要应用程序从本地存储库中提取缓存数据库,我就可以重新创建
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()。。。我不知道那件事。。。