You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 07:54:03