拆分表的替代方法实体框架6 - VARBINARY(MAX)

时间:2015-07-23 15:44:08

标签: entity-framework entity-framework-6

解决方案: 想法是加载问题来自表文件。因此,为了使所有内容按顺序排列,我必须关闭延迟加载,并使用blob从实体加载导航属性,而不是相反。

  public FileDto[] RetrieveFilesWithUserId(string id)
        {
            FileDto[] files;
            logger.Info("Looking for files #{0}", id);
            using (var db = ContextFactory.GetEntities())
            {
                db.Configuration.LazyLoadingEnabled = false;
                logger.Debug("User retrieved !");

                files = db.Files.Include("Users").Where(f => f.Users.Count(user1 => user1.Id == id) > 0).Select(
                    x =>
                        new FileDto
                        {
                            ContentType = x.ContentType,
                            Id = x.Id,
                            Name = x.Name,
                            Type = db.TypeFiles.FirstOrDefault(b => b.Id == x.Type).Description
                        }).ToArray();

                db.Configuration.LazyLoadingEnabled = true;
            }

            logger.Info("done looking for files");
            return files;
        }

问题是: 我有一个看起来很经典的问题。 我有一个包含一个大blob的表,当我加载它时,我遇到了巨大的性能问题(由于加载了大量数据)。

我有用户,那些用户有文件,在我的文件实体中我有数据。 关系很多很多。

轻松修复:我做了一些表拆分,我的所有问题都解决了。

问题:我的老板不希望我这样做(我认为这是最好的选择)。

那么,我该怎么做呢? 我想直接要求但我没有访问中间表(它们现在是导航属性。) 一个程序会成功吗?

1 个答案:

答案 0 :(得分:0)

您可以使用投影获取所需的所有字段而不使用blob:

var people = context.People.Select(p => new PersonDTO { Id = p.Id, Name = p.Name });

PersonDTO就像:

class ProductDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
}

DTO表示Data Transfer Object,它通常用于此类任务。