如何在Entity Framework Core中映射SQL Server FileTable
SQL Server FileTable 在 EF Core 5.0 中的无额外对象映射方案
不需要创建存储过程、视图或额外表,直接通过EF Core原生映射配置即可实现,适配你当前使用的C# 8.0、.NET Core 3.1、EF Core 5.0技术栈。
1. 定义FileTable对应实体类
你可以根据业务需要选择映射的字段,以下为包含FileTable核心系统字段的完整实体定义:
using System; public class MyFileTable { // 对应FileTable默认主键stream_id public Guid StreamId { get; set; } // 文件名/文件夹名 public string Name { get; set; } // 文件扩展名 public string FileType { get; set; } // 文件大小,数据库自动维护 public long? CachedFileSize { get; set; } // 创建时间,数据库自动维护 public DateTimeOffset CreationTime { get; set; } // 最后修改时间,数据库自动维护 public DateTimeOffset LastWriteTime { get; set; } // 是否为文件夹 public bool IsDirectory { get; set; } // 文件内容流 public byte[] FileStream { get; set; } // 可根据业务需要新增其他系统字段的映射,如is_hidden、is_readonly等 }
2. 在DbContext中配置映射关系
在OnModelCreating方法中配置实体与现有FileTable的映射,无需修改数据库结构:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyFileTable>(entity => { // 绑定现有FileTable的表名,注意替换为你实际的FileTable名称 entity.ToTable("你的FileTable实际表名"); // 配置主键,对应FileTable的stream_id字段 entity.HasKey(e => e.StreamId); entity.Property(e => e.StreamId) .HasColumnName("stream_id") // 主键由数据库自动生成,禁止手动赋值 .ValueGeneratedOnAdd(); // 配置字段与数据库列的映射 entity.Property(e => e.Name) .HasColumnName("name") .IsRequired(); entity.Property(e => e.FileType) .HasColumnName("file_type"); entity.Property(e => e.CachedFileSize) .HasColumnName("cached_file_size") // 字段由数据库自动维护,EF Core插入更新时不赋值 .ValueGeneratedOnAddOrUpdate(); entity.Property(e => e.CreationTime) .HasColumnName("creation_time") .ValueGeneratedOnAdd(); entity.Property(e => e.LastWriteTime) .HasColumnName("last_write_time") .ValueGeneratedOnAddOrUpdate(); entity.Property(e => e.IsDirectory) .HasColumnName("is_directory"); entity.Property(e => e.FileStream) .HasColumnName("file_stream"); }); }
3. 调整数据库连接字符串
在连接字符串中添加FILESTREAM访问支持配置:
Server=你的数据库地址;Database=你的库名;Integrated Security=True;MultipleActiveResultSets=True;FileStream Access Level=ReadWrite;
4. 基础操作示例
插入文件
var newFile = new MyFileTable { Name = "测试文件.txt", FileStream = System.IO.File.ReadAllBytes("本地文件路径.txt"), IsDirectory = false }; context.MyFileTables.Add(newFile); context.SaveChanges(); // 插入完成后可直接读取newFile.StreamId获取自动生成的主键
查询文件
// 根据主键查询文件 var file = context.MyFileTables.FirstOrDefault(f => f.StreamId == targetGuid); // 直接读取file.FileStream即可获取文件内容
插入文件夹
var newFolder = new MyFileTable { Name = "测试文件夹", IsDirectory = true, // 文件夹不需要赋值FileStream }; context.MyFileTables.Add(newFolder); context.SaveChanges();
注意事项
- 所有标记了
ValueGeneratedOnAdd/ValueGeneratedOnAddOrUpdate的字段均由SQL Server自动维护,无需手动赋值 - 如果业务不需要用到部分系统字段,可以直接从实体类中删除对应属性,无需全量映射
- EF Core 5.0原生支持varbinary(max)类型的读写,无需额外配置即可处理大文件流
内容的提问来源于stack exchange,提问作者Mohammad Mirmostafa
相关产品推荐
相关产品推荐

