0

私のクラスのLugar中にはこれがあります:

public virtual Foto FotosLugar { get; set; }

そして私はこの定義を持っています:

public class Foto
{
    [Column(TypeName = "image")]
    public byte[] Binary { get; set; }
}

私のLugarControllerで私は試しました:

 public ActionResult Create(Lugar lugar, HttpPostedFileBase FotosLugar)

いくつかの変換を試みましたが、どちらも機能しませんでした...

Imageクラスの中に収納したいLugar… 。

4

3 に答える 3

1

これを試して:

public ActionResult Create(Lugar lugar, HttpPostedFileBase fotosLugar)
{
    if (fotosLugar != null && fotosLugar.ContentLength > 0)
    {
        var contentLength = fotosLugar.ContentLength;
        var content = new byte[contentLength];
        fotosLugar.InputStream.Read(content, 0, contentLength);
        var foto = new Foto { Binary = content };
        lugar.FotosLugar = foto;
    }
    //... eventually return an ActionResult
}

Streamバイトはオブジェクトに含まれているため、ファイルは通常のデータよりも扱いが少し複雑です。上記のコードは、EF エンティティ クラスに格納できるように、ストリームからバイトを読み取ります。

その他の注意点: ContentLengthContentType、および場合によってFileNameFotoエンティティにも格納することは悪い考えではないかもしれません。このエンティティを 2 つに分割して、生のバイナリ ファイル データとは別にファイル名、コンテンツ タイプ、およびコンテンツの長さを照会できるようにすることも検討してください。私たちのサイトでは、ファイル名を取得するだけでよいという問題がありましたが、ファイル名byte[]と同じテーブルに列を保存したため、SQL は必要なときにすべてのバイナリ データを返していたため、そのクエリは遅かったです。は文字列ファイル名でした。最終的には、次のようなモデルで解決されました。

public class Foto
{
    public int Id { get; set; }
    public int ContentLength { get; set; }
    public string FileName { get; set; }
    public string ContentType { get; set; }
    public virtual FotoBinary Content { get; set; }
}

public class FotoBinary
{
    public int Id { get; set; }
    public virtual Foto Owner { get; set; }
    public byte[] Value { get; set; }
}

このようにして、string&intデータのみを個別にクエリし、必要に応じてバイナリ データを個別に一括読み込みまたは遅延読み込みできます。これら 2 つのエンティティ間のリレーションシップの流暢なマッピングを次に示します。

// Foto entity
HasRequired(principal => principal.Content)
    .WithRequiredPrincipal(dependent => dependent.Owner)
    .WillCascadeOnDelete(true);

// FotoBinary entity
HasRequired(dependent => dependent.Owner)
    .WithRequiredDependent(principal => principal.Content)
    .WillCascadeOnDelete(true);

上記と同様のマッピングを使用すると、データベース内のすべてのFotoFotoBinary行が同じ主キー ( Id) を共有します。一方の ID がわかっている限り、それを使用して、もう一方 (OwnerまたはContent) の対応する行をクエリできます。

最後に、少なくともLugarエンティティを MVC アクションに渡さないことを検討します。代わりに、のような ViewModel クラスを作成できますLugarViewModel。そのクラスは、Karthik の answer と同様の方法でHttpPostedFileBaseプロパティを持つことができます。その後、コントローラー アクションはビューモデルからデータを取得し、それを使用してエンティティにデータを設定できます。Lugar

于 2013-02-19T13:09:56.127 に答える
0

OK、これが私の見解です:

  • 基本エンティティ クラスには、最初に指定したような byte[] プロパティが必要です。それで大丈夫です
  • ビューに渡すことができ、コントローラーにポストバックできるビューモデル クラスを定義します。これは、タイプ HttpPostedFileBase のプロパティを持つ必要があるクラスです。
  • コントローラーにファイルを取得したら、ストリームをバイト配列に変換する必要があります (SQL Server に格納されるエンティティ オブジェクトに割り当てることができるようにするため)。これを行う方法について、マスタースキートからの素晴らしい回答があります: https://stackoverflow.com/a/221941/87454
于 2013-02-20T03:44:23.903 に答える
0

これがEFと関係があるかどうかはわかりません。あなたはまだそこに着いていないようです。

あなたが言っているのは、コントローラーのCreateアクション内でファイルを受け取ることができないということですよね?

少なくとも 2 つのオプションがあります。

  • 1 つのパラメーター ( HttpPostedFile/IEnumerable )を持つアクションがあり、モデルとは別に画像を取得する
  • または、コントローラー内の任意の場所にあるRequest.Filesにアクセスして、アップロードされたファイルのコレクションを取得し、後でLugarクラスに追加することもできます。追加のFotosLugarパラメータは必要ありません
于 2013-02-19T12:57:13.573 に答える