我需要在我的数据库中有一列由数据库计算为(总行)-(总行b)。我正在使用代码优先模型来创建我的数据库。
我的意思是:
public class Income {
[Key]
public int UserID { get; set; }
public double inSum { get; set; }
}
public class Outcome {
[Key]
public int UserID { get; set; }
public double outSum { get; set; }
}
public class FirstTable {
[Key]
public int UserID { get; set; }
public double Sum { get; set; }
// This needs to be calculated by DB as
// ( Select sum(inSum) FROM Income WHERE UserID = this.UserID)
// - (Select sum(outSum) FROM Outcome WHERE UserID = this.UserID)
}如何在EF CodeFirst中实现这一点?
发布于 2013-03-23 18:04:42
您可以在数据库表中创建computed columns。在EF模型中,您只需使用DatabaseGenerated属性注释相应的属性:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public double Summ { get; private set; } 或者使用流畅的贴图:
modelBuilder.Entity<Income>().Property(t => t.Summ)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed)正如Matija Grcic和评论中所建议的,将属性设置为private set是一个好主意,因为您可能永远不想在应用程序代码中设置它。Entity Framework对私有setter没有问题。
注意:用于EF .NET核心的您应该使用ValueGeneratedOnAddOrUpdate,因为HasDatabaseGeneratedOption不存在,例如:
modelBuilder.Entity<Income>().Property(t => t.Summ)
.ValueGeneratedOnAddOrUpdate()发布于 2013-03-23 18:09:30
public string ChargePointText { get; set; }
public class FirstTable
{
[Key]
public int UserID { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string Summ
{
get { return /* do your sum here */ }
private set { /* needed for EF */ }
}
}参考文献:
发布于 2019-02-19 01:44:32
自2019年起,EF核心支持您使用fluent API以干净的方式计算列:
假设DisplayName是您要定义的计算列,则必须像往常一样定义该属性,并可能使用私有属性访问器来防止对其赋值
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
// this will be computed
public string DisplayName { get; private set; }
}然后,在模型构建器中,使用列定义对其进行寻址:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.Property(p => p.DisplayName)
// here is the computed query definition
.HasComputedColumnSql("[LastName] + ', ' + [FirstName]");
}有关更多信息,请查看MSDN。
https://stackoverflow.com/questions/15585330
复制相似问题