我有以下 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
使用通用存储库,我需要获取一个包及其文件 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()
}
这是加载文件数据字段吗?我不要那个!
我应该使用投影来避免加载文件数据吗?
如果是,如何?第一个方法返回 T 而不是 IQueryable。
我正在使用 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
但是如何设置这种关系呢?
谢谢你,米格尔