如何在 EF Core 中插入时将影子属性的值设置为另一个属性的值?

问题描述 投票:0回答:1

如何在第一次插入时将影子属性的值设置为另一个属性的值?

我想使用

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);

https://learn.microsoft.com/en-us/ef/core/modeling/ generated-properties?tabs=data-annotations#compulated-columns

通知实体:

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()");
    
    ...
}
c# entity-framework-core
1个回答
0
投票

在 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;
    }
}

此方法也可用于管理其他阴影属性。

© www.soinside.com 2019 - 2024. All rights reserved.