0

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

但是如何设置这种关系呢?

谢谢你,米格尔

4

0 回答 0