2

我正在使用 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 查询中,我必须包含两个子集合,我认为这是一项性能密集型操作。或者,我也可以在数据库中使用计算列。但我不喜欢在数据库端放任何东西。那么,在不加载子集合或使用数据库解决方案的情况下填充计算字段(主要是计数、平均等聚合操作)的最佳方法是什么?

4

2 回答 2

0

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

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

回发时使用并发检查来保持完整性。即时间戳EF类型Rowversion,将是必要的

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

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

但是,如果您的应用程序需要悲观锁定,那么建议阅读 Ladislav 的这篇文章, 基本上 EF 不提供悲观锁定。

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

Context.Database.ExecuteSqlCommand()

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

毕竟,您仍然需要/想要悲观锁定信号量样式来访问数据。然后查看SQL server 上的应用程序锁

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

于 2013-06-27T15:03:28.180 回答
0

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

于 2013-06-27T13:33:39.367 回答