Первые вычисленные свойства кода Entity Framework

#entity-framework #ef-code-first #entity-framework-4.1

#entity-framework #ef-code-first #entity-framework-4.1

Вопрос:

Я использую подход Entity Framework «Сначала код» в ASP.NET Веб-приложение MVC 3. В моей базе данных у меня есть несколько вычисляемых столбцов. Мне нужно использовать эти столбцы для отображения данных (что отлично работает).

Однако, когда я приступаю к вставке строк в эту таблицу, я получаю следующую ошибку:

Столбец «ChargePointText» не может быть изменен, поскольку он либо является вычисляемым столбцом, либо является результатом оператора ОБЪЕДИНЕНИЯ.

Есть ли способ пометить свойство как доступное только для чтения в моем классе?

 public class Tariff
{
    public int TariffId { get; set; }
    public int Seq { get; set; }
    public int TariffType { get; set; }
    public int TariffValue { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int ChargePoint { get; set; }
    public string ChargePointText { get; set; }
}
  

Комментарии:

1. Да, вы правы — мой ответ был неправильным. Это не работает, только если вы хотите, чтобы EF сгенерировал базу данных. Опубликуйте свое обновление в качестве ответа и примите его.

Ответ №1:

Я нашел решение. Entity Framework предоставляет аннотацию данных, называемую DatabaseGenerated. Используйте это следующим образом:

 [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string ChargePointText { get; set; }
  

Получите более подробную информацию здесь: http://msdn.microsoft.com/en-us/library/gg193958.aspx

Комментарии:

1. Удалось ли вам заставить это работать для обновлений? В частности, для свойства «DateTime», скажем, для атрибута ‘LastUpdatedOn’ вашего класса модели?

Ответ №2:

Также есть пара других опций.

Первое — изменить настройку свойств в файле сопоставления с:

 this.Property(t => t.Name)
    .HasMaxLength(152);
  

Для:

 this.Property(t => t.Name)
    .HasMaxLength(152)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
  

Это почти то же самое, что и решение того же Хаггилла, за исключением того, что оно сохраняет эту конфигурацию в сопоставлении, а не в модели. Я чувствую, что это немного лучше, поскольку класс сопоставления уже содержит код, указывающий Entity Framework, как загружать этот тип объекта, поэтому информация о том, что вычисляется поле, принадлежит там.

Другим вариантом является NotMappedAttribute , который может быть применен к отдельным свойствам объекта следующим образом:

 public class User
{
    ...

    [NotMapped]
    public string Name
    {
        get;
        set;
    }

    ...
}
  

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

Комментарии:

1. Он пытается использовать вычисляемые поля базы данных. «NotMapped» не поможет ему сделать это.

2. ДА. Я сделал. Использование атрибута not mapped не поможет ему отображать вычисляемые поля db в своем приложении, если он не хочет также вычислять их в своем приложении.