次の EF 5.0 エンティティがあります。
public class Pack {
public Int32 Id { get; set; }
public virtual ICollection<File> Files { get; set; }
} // Pack
public class File {
public Int32 Id { get; set; }
public Byte[] Data { get; set; }
} // File
汎用リポジトリでは、データではなく 1 つのパックとそのファイル ID を取得する必要があります。
私の汎用リポジトリには、次の方法があります。
public T First<T>(Expression<Func<T, Boolean>> criteria) where T : class {
return _context.Set<T>().FirstOrDefault(criteria);
} // First
次のように、Pack を取得し、PackDtoModel にマッピングしています。
Pack pack = _repository.First<Pack>(x => x.Id == packId);
PackDtoModel model = new PackDtoModel {
Id = pack.Id,
FilesIds = pack.Files.Select(x => x.Id).ToList()
}
これはファイル データ フィールドをロードしていますか? 私はそれをしたくありません!
Files データの読み込みを避けるためにプロジェクションを使用する必要がありますか?
はいの場合、どのように?最初のメソッドは、IQueryable ではなく T を返します。
私は Configuration.LazyLoadingEnabled = true を使用しています ...
テーブル分割を使用すると、次を使用できます。
create table dbo.Packs
(
Id int identity not null
constraint Packs_Id_PK primary key clustered (Id)
);
create table dbo.Files
(
Id int not null
constraint Files_Id_PK primary key clustered (Id),
Data varbinary (max) filestream null
constraint Files_Data_DF default (0x),
[Key] uniqueidentifier rowguidcol not null
constraint Files_Key_U unique,
Mime nvarchar (200) not null,
CONSTRAINT Files_ID_Mime_UQ UNIQUE (Id, Mime)
) filestream_on [STORAGE];
add constraint Files_Id_FK foreign key (Id) references dbo.Packs(Id) on delete cascade on update cascade;
したがって、ファイル ID はパック ID と同じです。
そして、ファイル ID と MIME が一意になるように制約を追加しました。
したがって、私のアプリケーションでは、GET FILE WITH ID = PACKID & MIME = "image/jpg" を使用します。
パックを入手した瞬間に、そのパックに関連付けられているファイルの ID がわかりました。
必要なバージョン (mime) を指定するだけで済みます...
どう思いますか?
私の問題は、これをエンティティにマップする方法です...
理論的には、パックにはまだ多くのファイルが必要です。
public class Pack {
public Int32 Id { get; set; }
public virtual ICollection<File> Files { get; set; }
} // Pack
しかし、この関係をどのように設定するのでしょうか?
ありがとう、ミゲル