#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 в своем приложении, если он не хочет также вычислять их в своем приложении.