2016-05-17 4 views
4

У меня есть этот объект карты для Entity Framework:Как остановить EF, пытающуюся обновить вычисленный столбец для SQL Server?

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

После этого вы просто удалите следующую конфигурацию 'HasDatabaseGeneratedOption (System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed);' на конфигурации Ascii – CodeNotFound

+0

Разве это не инструкция, которая сообщает (или должна сказать) EF не трогать эта колонка? Вы предлагаете мне удалить это и что бы я его заменил? Спасибо –

+0

Потому что свойство Accii не является первичным ключом. EF рассмотрит это свойство как невырожденное свойство. – CodeNotFound

ответ

4

Сообщение об исключении указывает на то, что ваша свободная конфигурация полностью игнорируется инфраструктурой, потому что в коде нет ничего плохого.

Затем Entity Framework сопоставляет ваши свойства с использованием стандартного соглашения, не зная, что свойство Ascii является вычисленным.

Чтобы разрешить проверку вопроса, который экземпляр вашего WordDefinitionMap класса создается и добавляется к MODELBUILDER:

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

Как и в сторону: Я хотел бы предложить вам сделать ваше вычисленное свойство не записываемый, поворачивая его сеттера private:

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

Это позволит избежать ошибочно установки этого свойства в то время как EF будет продолжать заполнять его из базы данных без проблем.