如何停止EF尝试更新SQL Server的计算列?

Sam*_*tar 4 c# asp.net entity-framework asp.net-web-api

我有用于实体框架的此对象映射:

public WordDefinitionMap(string schema)
{
    ToTable(schema + ".WordDefinition");
    HasKey(x => x.WordDefinitionId);

    Property(x => x.WordDefinitionId).HasColumnName(@"WordDefinitionId").IsRequired().HasColumnType("int").HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
    Property(x => x.WordFormId).HasColumnName(@"WordFormId").IsRequired().IsUnicode(false).HasColumnType("varchar").HasMaxLength(20);
    Property(x => x.Ascii).HasColumnName(@"Ascii").IsOptional().HasColumnType("int").HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed);

    // Foreign keys
    HasRequired(a => a.WordForm).WithMany(b => b.WordDefinitions).HasForeignKey(c => c.WordFormId); // FK_WordDefinitionWordForm
}

public class WordDefinition
{
    public int WordDefinitionId { get; set; } // WordDefinitionId (Primary key)
    public string WordFormId { get; set; } // WordFormId (length: 20)
    public int? Ascii { get; set; } // Ascii

    // Foreign keys
    public virtual WordForm WordForm { get; set; } // FK_WordDefinitionWordForm
}
Run Code Online (Sandbox Code Playgroud)

当我使用实体框架尝试更新此对象时,出现异常消息:

The column "Ascii" cannot be modified because it is either a computed column or is the result of a UNION operator.
Run Code Online (Sandbox Code Playgroud)

我以为我已经在指示EF忽略此属性,但即使它为null,它似乎仍在尝试更新它。有什么方法可以更改映射,以便EF不设置此属性?

Fed*_*uma 5

异常消息表明,框架完全忽略了您的流利配置,因为您的代码没有错。

然后,实体框架使用标准约定映射您的属性,而无需知道该Ascii属性是经过计算的属性。

要解决该问题,请检查WordDefinitionMap是否创建了您的类的实例并将其添加到modelBuilder中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new WordDefinitionMap("mySchema"));
    //other mappings
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我建议您通过旋转设置器,使计算属性不可写private

public int? Ascii { get; private set; } // Ascii
Run Code Online (Sandbox Code Playgroud)

这将避免错误设置此属性,而EF将继续从数据库中毫无问题地填充它。