实体框架5和投影/延迟加载

时间:2012-12-09 13:20:51

标签: c# .net entity-framework lazy-loading

我有以下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

使用通用存储库我需要获取ONE pack及其文件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是唯一的。

所以现在在我的应用程序中我会使用:获取ID = PACKID&amp; MIME =“image / jpg”。

我收到包装的那一刻,我知道与该包装相关的文件的ID。

我只需要指定我想要的版本(mime)......

您怎么看?

我现在的问题是如何将其映射到实体......

理论上我应该还有很多文件:

public class Pack {
  public Int32 Id { get; set; }
  public virtual ICollection<File> Files { get; set; }
} // Pack

但是如何设置这种关系?

谢谢你, 米格尔

0 个答案:

没有答案