如何在第一次插入时将影子属性的值设置为另一个属性的值?
我想使用
CreatedAt
阴影属性记录插入实体的时间,该属性是这样创建的,因为它对用户来说应该是不透明的。
虽然我将其配置为默认值(
HasDefaultValueSql("GETUTCDATE()")
),但我希望它与用户在插入时提供的UpdatedAt
值相匹配。
此外,是否可以将其设置为只读,以便无法使用例如更改其值
EF.Property<DateTime>(x, "CreatedAt") = DateTime.UtcNow
?
我已经考虑过
HasComputedColumnSql
的存储版本,但它需要一个 SQL 条件运算符,例如 [CreatedAt] ? [CreatedAt] : [UpdatedAt]
,我认为它不存在。
modelBuilder.Entity<Person>()
.Property(p => p.NameLength)
.HasComputedColumnSql("LEN([LastName]) + LEN([FirstName])", stored: true);
通知实体:
public sealed record Notification(
AssetType AssetType,
Guid AssetId,
AssetIssue AssetIssue,
Guid OwnerId,
string DisplayName,
string? GivenName,
string? Surname,
string UserPrincipalName)
{
public required NotificationStatus Status { get; set; }
public required int NotificationCount { get; set; }
public required DateTime UpdatedAt { get; set; }
}
IEntityType配置:
public void Configure(Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder<Notification> builder)
{
// Properties
...
builder.Property(p => p.UpdatedAt).HasDefaultValueSql("GETUTCDATE()");
// Shadow Properties
builder.Property<DateTime>("CreatedAt").HasDefaultValueSql("GETUTCDATE()");
...
}
在 EF Core 中,无法使用
EF.Property
直接设置影子属性的值,除非使用 ExecuteUpdate
或 ExecuteUpdateAsync
。
影子属性值在
ChangeTracker
内管理,并且应通过实体的 Entry
执行更新。这是一个例子:
var modifiedEntries = context.ChangeTracker.Entries()
.Where(entry => entry.State == EntityState.Added || entry.State == EntityState.Modified);
foreach (var entry in modifiedEntries)
{
var propertyEntry = entry.Property<DateTime>("CreatedAt");
if (propertyEntry != null && entry.State == EntityState.Added)
{
propertyEntry.CurrentValue = DateTime.Now;
}
}
此方法也可用于管理其他阴影属性。