我有一个实体,我想拥有一个属性,该属性包含一个整数,该整数通过在同一天创建的先前实体的数量来获取值。
假设我有BooksOrder类。当新的BooksOrder创建并保存到Db时,我希望它的属性int DailyCount
相等BooksOrders.Where(bo => bo.Created.Day == DateTime.UtcNow.Day).Count() + 1
哪里是实施它的最佳地点? OnModelCreating
定义DbContext?
如果有,怎么样?
或者在迁移定义文件中,通过编辑Up()
方法并使用SQL查询定义defaultValueSQL
?对于DateTime属性,我之前使用GETDATE()
Sql函数,但在这种情况下不一样。
我想到的第三种方法是覆盖DbContext的SaveChanges()方法:
public override int SaveChanges()
{
var AddedBooksOrders = ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added && e.Entity is BooksOrder)
.Select(e => e.Entity).Cast<BooksOrder>();
foreach (var abo in AddedBooksOrders)
{
abo.DailyCount = BooksOrders.Where(bo => bo.Created.Day == DateTime.UtcNow.Day).Count() + 1;
}
return base.SaveChanges();
}
我的猜测是不行的,因为它不会让我在DbContext类定义本身中查询DbSet BooksOrders(如果不是静态的,我们需要一个istance,这在定义时不存在)
你们遇到了一个类似的问题吗?我很高兴知道它是否可能以及如何。
由于
答案 0 :(得分:0)
即使我不想进入存储过程业务,至少与EF Code First集成,我对该解决方案感到满意。 首先,我将该属性添加到我的实体:
public int DailyCount { get; set; }
然后,包管理器:add-migration "WithDailyCount"
。最后,在迁移定义中将存储过程代码添加到Up()
方法(以及在Down()
方法中删除它的方法)
public override void Up()
{
AddColumn("myDb.BookOrders", "DailyCount", c => c.Int(nullable: false));
Sql(string.Format(@"
CREATE PROCEDURE [myDb].[DailyCountIncrement]
AS
BEGIN
DECLARE @DCountPlusOne int
SET @DCountPlusOne .....More SQL code here to read and increment count goes here
SELECT @DCountPlusOne
END"));
}
public override void Down()
{
DropColumn("myDb.BookOrders", "DailyCount");
DropStoredProcedure("myDb.DailyCountIncrement");
}