首页 > 解决方案 > EF Core:条件计算列

问题描述

在我的模型中,我有 AccountType 属性,该属性主要由数据库触发器生成,但有时也可以直接分配:

public class Account
{
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public int AccountType { get; set; }
}

每当执行 databaseContext.SaveChanges() 时,属性 [DatabaseGenerated] 允许我自动获取数据库生成的值。但是,如果我希望明确分配 AccountType,此属性似乎也阻止发送值。实现这种“部分”生成/计算的列的最佳方法是什么?

标签: asp.net-coreentity-framework-coreef-core-2.1

解决方案


但是,如果我希望明确分配 AccountType,此属性似乎也阻止发送值。实现这种“部分”生成/计算的列的最佳方法是什么?

如果您想为使用 修饰的属性设置显式值[DatabaseGenerated(DatabaseGeneratedOption.Computed)],则需要下拉到较低级别的元数据 API 并设置AfterSaveBehavior/BeforeSaveBehavior如下所示:

  1. IMutableProperty.BeforeSaveBehavior 属性用于添加状态

    modelBuilder.Entity<Test>()
             .Property(t => t.TestType)
             .Metadata.BeforeSaveBehavior=PropertySaveBehavior.Save;
    
  2. IMutableProperty.AfterSaveBehavior 属性用于更新状态

    modelBuilder.Entity<Test>()
             .Property(t => t.TestType)
             .Metadata.AfterSaveBehavior =PropertySaveBehavior.Save;
    

PropertySaveBehavior指示实体框架更改跟踪将如何处理属性值的更改,这反过来将确定值集是否发送到数据库。


推荐阅读