2

プロフィール画像が必要な単純なエンティティがあります。これを行うための適切な方法は何ですか?つまり、これは1対1の関係であり、1つの画像は1つのエンティティにのみ関連し、その逆も同様です。この画像は、関連するエンティティを挿入するとともに、Webフォームを介してアップロードする必要があります。

誰かが私に正しい方向を示すことができれば、dbと関連エンティティに画像を永続化する方法は素晴らしいでしょう。

4

3 に答える 3

5

ちょっとしたコメント:画像をdbに保存するのは良い考えではないと思います

一般に、dbは大きなバイナリチャンクではなくテキストを格納するように設計されているため、dbに画像を格納することはお勧めできません。画像のパスを保存し、画像をフォルダに保存する方がはるかに優れています。エンティティのID(1323.jpg)を持つ1対1の関係名の画像を確認したい場合。

画像パスが必要な場合は、いくつかのガイドラインに従う必要があります(一般的には防御的にコードを記述します)。

  • 画像のアップロード時に、画像が有効であることを確認します(画像ヘッダーのバイナリチェックも行います)
  • 新しいエンティティを挿入する場合は、既存の画像を上書きしないでください。
  • 主キーとして画像に名前を付ける(1.jpg、2.jpg)
  • 画像の読み込み時に、画像がそこにあると想定しないでください。
  • (可能であれば)手動で画像を操作しないでください(マシンでのリモート操作や、ある場所から別の場所への画像のコピーは禁止されています)。手動で操作すると、不整合が発生する可能性があります。

しかし、私は何らかの理由であなたがそれをすべきだと思います。だからあなたが望むものを達成するために:

DB設計

  • テーブルにバイナリ列(binaryまたはvarbinary)を作成します
  • 1-1の関係で別のテーブルに作成するとよいでしょう。ただし、このアイデアは、エンティティに水分を補給するときに画像を読み込まないようにすることです。遅延読み込みアプローチを使用して、必要な場合にのみ画像を読み込みます。
  • 大きな選択を行うときは、画像を読み込まないようにする必要があります(たとえば、コンボですべてのエンティティを読み込む場合は、SELECT * Fromを避けてください)。何千もの画像が無料で読み込まれるためです。私が言ったように、これは別のテーブルに画像を置くか、SELECTに適切な列のみをロードするか、遅延ロードを行うことで実行できます。(または、DBにイメージを持たず、パスのみを使用することでさらに改善されます)

C#コード

于 2012-06-08T08:58:31.650 に答える
1

コードは簡単ですが、なぜDBなのですか?これがWebサイトの場合は、簡単に参照できるディスク上の場所に保存してみませんか?

データベースは、既知のサイズと比較的小さいサイズのデータ​​を格納するように最適化されています。画像の長さはおそらく8KBを超えます(MAXデータ型を意味します)。画像は「プロフィール」とは別の行/ページに保存されます。

個人的には、既知のフォルダーに画像を保存し、画像名にIDを使用します。画像がなく、標準のgifなどを使用しているプロファイルの場合は、プロファイルIDのsimlinks / hardlinksを共通のgifに設定することで、単純に/トリミングしてください。

public class Profile
{
    public int Id {get;}
    public string Name {get; private set;}
    public Image Picture {get; private set;}

    public void Save()
    {
        using (var connection = new SqlConnection("myconnectionstring"))
        using (var command = new SqlCommand("", connection))
        {
            command.CommandText =
                "UPDATE dbo.TblProfile " +
                "SET " +
                    "Name = @name, " +
                    "Picture = @picture " +
                "WHERE ID = @id";
            command.Parameters.AddWithValue("@name", Name);
            command.Parameters.AddWithValue("@picture", Picture);
            command.Parameters.AddWithValue("@id", Id);
            command.ExecuteNonQuery();
        }
    }
}
于 2012-06-08T08:58:24.963 に答える
0

次のリンクがあなたに解決策を与えると思います、

画像をアップロードしてDBに保存

于 2012-06-08T08:56:48.263 に答える