我有实体框架的这个对象图:
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没有设置这个属性?
答案 0 :(得分:4)
异常消息表明框架完全忽略了您的流畅配置,因为您的代码没有任何问题。
然后,实体框架使用标准约定映射您的属性,而不知道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将继续从数据库中填充它而不会出现问题。