在我的项目中,我有一个有点大的数据库,大约有 60 个表。我应该保存和收集许多图像文件(大约 5000 个),它们的平均大小约为 2MB。
我的数据库的估计大小将是 10 GB 甚至更高!
首先在代码中考虑这些模型:
class Document
{
[Key]
public int Id {get;set}
// ...
public virtual ICollection<ImageDocument> Images {get;set;}
}
和
class ImageDocument
{
[Key]
public int Id {get;set}
// ...
public Document Document {get;set;}
}
如您所见,每个 Document 都有一些ImageDocuments
.
我的解决方案:
考虑以下两步:
添加
ImageDocuments
到相关文档,然后通过调用Add
和SaveChange
方法添加生成的文档EntityFramework
DbContext
。ImageDocuments
为每个相关文档调用创建的存储过程。调用的存储过程使用 bcp 命令从数据库中提取图像文件并将其保存在服务器的特定路径中,然后ImageDocument
从数据库中删除该数据。
它有效,但我在这种方式下遇到了一些问题:
- 我无法创建备份集成文件。
- 由于我的保存交易导致的原子性违规被破坏为一些小交易。
- 一致性违规。可能在调用存储过程时系统陷入崩溃。
- 耐久性违规。因为删除
ImageDocument
记录释放数据库空间。
现在我的问题是,有没有更好的解决方案来做到这一点并解决问题?
如果我们可以在 SQL Server 中创建一个文件字段来维护文件分隔的数据库文件中的内容,那就太好了。