Первый вычислительный объект Entity Framework Code
Я использую подход Entity Framework "Code First" в веб-приложении ASP.NET MVC 3. В моей базе данных есть несколько вычисленных столбцов. Мне нужно использовать эти столбцы для отображения данных (что отлично работает).
Однако, когда я прихожу, чтобы вставлять строки в эту таблицу, я получаю следующую ошибку:
Столбец "ChargePointText" не может быть изменен, поскольку это либо вычисленный столбец или результат UNION.
Есть ли способ пометить свойство как readonly в моем классе?
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
Я нашел решение. Entity Framework предоставляет аннотацию данных под названием DatabaseGenerated. Используйте его так:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string ChargePointText { get; set; }
Получить более подробную информацию здесь: http://msdn.microsoft.com/en-us/library/gg193958.aspx
Ответ 2
Есть еще пара других вариантов.
Во-первых, нужно изменить настройку свойств в файле сопоставления:
this.Property(t => t.Name)
.HasMaxLength(152);
в
this.Property(t => t.Name)
.HasMaxLength(152)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
Это почти то же самое, что и решение Same Huggill, за исключением того, что оно сохраняет эту конфигурацию в сопоставлении, а не в модели. Я чувствую, что это немного лучше, так как класс отображения уже содержит код, чтобы сообщить Entity Framework, как загружать этот тип объекта, так что знание о том, что поле вычисляется, принадлежит там.
Другим вариантом является NotMappedAttribute
, который может быть применен к индивидуальным свойствам объекта, подобному этому:
public class User
{
...
[NotMapped]
public string Name
{
get;
set;
}
...
}
Это полезно, когда объект содержит свойства, которые не заполняются из базы данных, но он должен быть одинаково полезен в сценарии, с которым сталкивается OP, т.е. EF не будет пытаться нажать значение в свойстве, помеченном NotMappedAttribute
, поэтому вставка должна работать.