Подтвердить что ты не робот

Первый вычислительный объект 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; }
}
4b9b3361

Ответ 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, поэтому вставка должна работать.