假设我有一个电影租赁应用程序(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/