web-dev-qa-db-ja.com

Entity Framework Coreを使用してデータベースにファイルを保存する

ASP.NET CoreアプリでEntity Framework Core(Code-First)を使用してSQL Serverデータベースにファイルを保存する方法

Filestreamを使用してみましたが、残念ながら次のエラーが発生します。

エンティティタイプ 'UserProfile'のプロパティ 'Avatar'のプロパティは、ナビゲーションプロパティとして構成されているため呼び出すことができません。プロパティはスカラープロパティの構成にのみ使用できます

これがコードです:

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);
    }
}

私は何をしますか?ありがとう!

7
stroibot

ファイルのバイトをバイト配列に変換できます。

public byte[] Avatar { get; set; }

EF6の類似のアプローチで受け入れられた回答を調べます: Entity Framework 6を​​使用してSQL Serverからイメージ(バイナリ)を保存および取得します

11
Roman Bartke

私はあなたがSQLサーバーのWindowsファイルストリームを使用しようとしていると仮定しています、それは まだ.NET Coreではサポートされていません です。すでに述べたように(SQLサーバーでvarbinary(max)に変換されます)バイト配列としてファイルを保存し、たとえばメモリストリームを使用してアップロードするときにファイルコンテンツをコピーする必要があります。

2
alsami

Efコアでは、これまでデータベースにファイルを保存できないため、次のことができます。

  1. 次のように、ファイルの読み取り結果をbyte []として保存します。
public byte[] Avatar { get; set; }
var avatar =  File.ReadAllBytes(filePath);

2.マシンをファイルサーバーとして使用し、ファイルのパスをデータベースに保存します:

public string Avatar { get; set; }

私の意見では2番目の方法の方が優れており、常にこのパターンを使用しますが、それはマシンのH.D.Dと格納するファイルの量によって異なります。

1
farid salehi