【问题标题】:What is the most optimized way of implementing computed fields using Entity Framework?使用实体框架实现计算字段的最优化方式是什么?
【发布时间】:2013-06-24 20:17:13
【问题描述】:

我正在使用 Entity Framework/Fluent API,我是新手。在我的场景中,我有以下三个类。

public class Review
{
    public int Id { get; private set; }
    public float AverageRating { get; private set; } //Computed Field
    public int TotalLikes { get; private set; } //Computed Field
    public List<Rating> Ratings { get; private set;}
    public List<Like> Likes { get; private set;}
}
public class Rating
{
    public int CustomerId { get; private set; }
    public int ReviewId { get; private set; }
    public int Rating { get; set; }
}
public class Like
{
    public int CustomerId { get; private set; }
    public int ReviewId { get; private set; }
}

我对所有三个类及其关系都有 Fluent 映射。在复习课中,我有两个计算字段。我可以从子集合(Ratings 和 Likes)中填充计算字段。在这种情况下,在 Linq 查询中,我必须包含两个子集合,我认为这是一项性能密集型操作。或者,我也可以在数据库中使用计算列。但我不喜欢在数据库端放任何东西。那么,在不加载子集合或使用数据库解决方案的情况下填充计算字段(主要是聚合操作,如 Count、Average 等)的最佳方法是什么?

【问题讨论】:

    标签: entity-framework ef-code-first fluent-interface computed-field


    【解决方案1】:

    如果您不想使用存储过程之类的数据库解决方案或在数据库端使用计算列,那么我想这给我们留下了一个选择。那就是在您的存储库中有一个方法,例如GetRatings() 或类似的方法,并在该方法中使用 linq 查询来计算评级,当然 LINQ to Entities 会将该 Linq 查询转换为本机 SQL 查询,因为它是本机的,所以应该更快到数据库。

    【讨论】:

      【解决方案2】:

      不使用数据库解决方案...

      Linq 有 count/max/average、Sum、groupby、distinct .... 等,因此一旦数据库“计算”了数据,例如 count 或 sum 整数通常不是问题。 因此无需将所有对象拖回。

      回发时使用并发检查来保持完整性。 ie Timestamp EF type Rowversion,必填

      基本上,使用 EF,您可以在上下文中输入一个值并说保存。 所以要记住的关键是在保存的时候,如何确保数据是好的。 这就是 Rowversion 的作用。 (乐观锁)

      如果您要更改的记录在您阅读后更改,则失败。 您重新读取/重新计算并重试。

      但是,如果您的应用程序需要悲观锁定 然后this article from Ladislav is recommended reading 本质上 EF 不提供悲观锁定。

      但是,您可以使用 EF 上公开的方法调用 DB,或者只调用 DB。

      Context.Database.ExecuteSqlCommand()
      

      注意默认情况下EF不读取Dirty数据。(即没有未提交的读取)

      毕竟您仍然需要/想要悲观锁定信号量样式来访问数据。 然后看Application Lock on SQL server

      是的,您将需要数据库,除非您手边有 ENQUEUE 服务器;-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-16
        • 1970-01-01
        相关资源
        最近更新 更多