如何为依赖于先前实体计数的实体的 属性 设置默认值

How to set a default value for a property of an entity that depends on count of previous ones

我有一个实体,我想要一个 属性,它包含一个整数,该整数根据同一天创建的先前实体的数量获取值。

假设我有 BooksOrder class。当一个新的 BooksOrder 创建并保存到 Db 时,我希望它的 属性 int DailyCount 等于 BooksOrders.Where(bo => bo.Created.Day == DateTime.UtcNow.Day).Count() + 1

实施它的最佳地点在哪里? OnModelCreating DbContext 的定义? 如果有,怎么样?

或者在迁移定义文件中,通过编辑 Up() 方法并使用 SQL 查询定义 defaultValueSQL?我之前确实将它与 GETDATE() Sql 函数一起用于 DateTime 属性,但不像在这种情况下那样。

我想到的第三种方式是覆盖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 class 定义本身中查询 DbSet BooksOrders(如果不是静态的,我们需要一个当时不存在的实例这个定义)

你们 运行 遇到过类似的问题吗?我很乐意知道这是否可行以及如何实现。

谢谢

尽管我不想涉足存储过程业务,但至少与 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");
    }