如何使用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);
}
}
我该怎么办?谢谢!
答案 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核心,直到现在您都无法在数据库中存储文件,因此您可以:
public byte[] Avatar { get; set; }
var avatar = File.ReadAllBytes(filePath);
2。使用您的机器作为文件服务器,并将文件的路径存储在数据库中:
public string Avatar { get; set; }
我认为第二种方法更好,我始终使用此模式,但这取决于您计算机的H.D.D和要存储的文件数量。