如何为实体的属性设置默认值,该属性取决于先前的属性

时间:2015-04-11 11:11:44

标签: c# entity-framework entity-framework-6

我有一个实体,我想拥有一个属性,该属性包含一个整数,该整数通过在同一天创建的先前实体的数量来获取值。

假设我有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,这在定义时不存在)

你们遇到了一个类似的问题吗?我很高兴知道它是否可能以及如何。

由于

1 个答案:

答案 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");
    }