如何为依赖于先前实体计数的实体的 属性 设置默认值
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");
}
我有一个实体,我想要一个 属性,它包含一个整数,该整数根据同一天创建的先前实体的数量获取值。
假设我有 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");
}