使用Entity Framework Core将文件存储在数据库中

时间:2018-02-17 19:54:00

标签: c# .net sql-server asp.net-core entity-framework-core

如何使用ASP.NET核心应用程序中的Entity Framework Core(代码优先)在SQL Server数据库中存储文件?

我尝试过使用Filestream,但不幸的是我收到了这个错误:

  

无法为属性' Avatar'在实体类型' UserProfile'因为它被配置为导航属性。属性只能用于配置标量属性

以下是代码:

public class UserProfile : BaseEntity {
    public FileStream Avatar { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public Sex Sex { get; set; }
    public string Address { get; set; }
    public string PhoneNumber { get; set; }

    public virtual IEnumerable<Email> Emails { get; set; }
    public virtual User User { get; set; }
    public int UserID { get; set; }
}

并映射:

public class UserProfileMap {
    public UserProfileMap(EntityTypeBuilder<UserProfile> entityBuilder) {
        entityBuilder.HasKey(e => e.ID);
        entityBuilder.Property(e => e.Avatar);
        entityBuilder.Property(e => e.FirstName);
        entityBuilder.Property(e => e.LastName);
        entityBuilder.Property(e => e.DateOfBirth);
        entityBuilder.Property(e => e.Sex);
        entityBuilder.Property(e => e.Address);
        entityBuilder.Property(e => e.PhoneNumber);
        entityBuilder.HasMany(e => e.Emails).WithOne(u => u.UserProfile).HasForeignKey(x => x.UserProfileID);
    }
}

我该怎么办?谢谢!

3 个答案:

答案 0 :(得分:8)

您可以将文件字节转换为字节数组。

public byte[] Avatar { get; set; }

检查EF6的类似方法中接受的答案: Save and retrieve image (binary) from SQL Server using Entity Framework 6

答案 1 :(得分:2)

我假设您正在尝试将Windows文件流用于sql server,即not yet supported by .NET Core。您必须将文件存储为已经说过的字节数组(将在sql server中转换为varbinary(max))并在使用内存流上传时复制文件内容。

答案 2 :(得分:1)

通过Ef核心,直到现在您都无法在数据库中存储文件,因此您可以:

  1. 将读取文件的结果存储为字节[] 像这样:
public byte[] Avatar { get; set; }
var avatar =  File.ReadAllBytes(filePath);

2。使用您的机器作为文件服务器,并将文件的路径存储在数据库中:

public string Avatar { get; set; }

我认为第二种方法更好,我始终使用此模式,但这取决于您计算机的H.D.D和要存储的文件数量。