簡體   English   中英

如何阻止EF嘗試更新SQL Server的計算列?

[英]How can I stop EF trying to update a computed column for SQL Server?

我有Entity Framework的這個對象圖:

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
}

當我使用Entity Framework嘗試更新此對象時,我得到一個異常說:

The column "Ascii" cannot be modified because it is either a computed column or is the result of a UNION operator.

我以為我已經指示EF忽略這個屬性,但它似乎仍在嘗試更新它,即使它是null。 有什么方法可以更改映射,以便EF不設置此屬性?

異常消息表明框架完全忽略了您的流暢配置,因為您的代碼沒有任何問題。

然后,實體框架使用標准約定映射您的屬性,而不知道Ascii屬性是計算屬性。

要解決此問題,請檢查是否已創建WordDefinitionMap類的實例並將其添加到modelBuilder:

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

暫且不說:我建議你通過將其setter private來使你的計算屬性不可寫:

public int? Ascii { get; private set; } // Ascii

這樣可以避免錯誤地設置此屬性,而EF將繼續從數據庫中填充它而不會出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM