c# - 根据另一个表中的条目计算的 Entity Framework 属性

标签 c# entity-framework

假设我有一个电影租赁应用程序(DVD、蓝光或其他一些物理媒体),在用户归还电影后,他们可以对其进行评分。这是表格的简化版本:

Ratings
--------------------------------------------
| Id | UserId | MovieId | Rating (1 to 10) |
--------------------------------------------

Movies
------------------------------------------
| Id | Name | Computed rating (1 to 100) |
------------------------------------------

有没有办法配置 Entity Framework 以使用评级表中的条目来计算电影的评级?因为在电影表中包含评级字段有点多余,我想知道 Entity Framework 是否可以为我处理它,而不必每次加载电影时都这样做。

我知道 nHibernate 可以将公式与属性关联起来。

最佳答案

计算聚合值将通过 SQL 触发器完成。

要创建触发器,您需要重写初始化程序中的 Seed 方法(CreateDatabaseIfNotExists 似乎适合您的情况)。

例如,给定以下模型 -

public class Movie
{
    public string Name { get; set; }
    public int SumOfAllRatings { get; set; }

    public virtual Collection<Rating> Ratings { get; set; }
}

public class Rating
{
    public virtual Movie Movie { get; set; }
    public int Rating { get; set; }

}

和 DbContext -

public class MyDbContext : DbContext
{
    public MyDbContext() : base()
    {
        Database.SetInitializer<MyDbContext>(new MyInitializer());
    }

    public DbSet<Movie> Movies { get; set; }
    public DbSet<Rating> Ratings { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Movie>().Property(m => m.SumOfAllRatings)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)
    }
}

这是创建适当触发器的初始值设定项 -

public class MyInitializer : CreateDatabaseIfNotExists<MyDbContext>
{
  string _sql = "create trigger T_Ratings_Change " +
       "on dbo.Ratings after insert, update as " +
       "update Movies set SumOfAllRatings = " +
       "(select SUM(Rating) from Ratings where MovieId = inserted.MovieId) " +
       "from Movies inner join inserted ON Movies.Id = inserted.MovieId";


  protected override void Seed(MyContext context)
  {
    context.Database.ExecuteSqlCommand(_sql);
  }
}

关于c# - 根据另一个表中的条目计算的 Entity Framework 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25700236/

相关文章:

c# - Entity Framework 生成错误的 SQL

C#从csv中提取数据

c# - MVC 5 重定向到登录页面不适用于 OWIN

c# - 带搜索框的多线程

c# - 如何将 Kendo 文本框控件绑定(bind)到它的数据?

c# ef - 在一个公用表与其他三个或更多表之间创建一对零/一映射的最佳方法

asp.net-mvc - 尝试使用 Linq 获取数据时出现错误 'cannot be initialized in a query result'

entity-framework - 具有附加参数的同一实体上的 Entity Framework 多对多关系

c# - 为什么我的简单 lidgren 客户端使用这么多内存?

c# - 将现有数据库链接到 Entity Framework