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

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

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

Столбец "ChargePointText" нельзя изменить, так как он либо является вычисляемым столбцом, либо является результатом оператора UNION.

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

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; }
}

person Sam Huggill    schedule 16.05.2011    source источник
comment
Да, вы правы, мой ответ был неверным. Это не работает, только если вы хотите, чтобы EF создавал базу данных. Опубликуйте свое обновление в качестве ответа и примите его.   -  person Ladislav Mrnka    schedule 16.05.2011


Ответы (2)


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

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

Дополнительные сведения см. здесь: http://msdn.microsoft.com/en-us/library/gg193958.aspx

person Sam Huggill    schedule 16.05.2011
comment
Удалось ли вам заставить это работать для ОБНОВЛЕНИЙ? В частности, для свойства DateTime, например, для атрибута LastUpdatedOn вашего класса модели? - person Abhijeet Patel; 12.03.2016

Есть еще пара вариантов.

Во-первых, изменить настройку свойства в файле сопоставления с:

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

to:

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

person Umar Farooq Khawaja    schedule 20.06.2013
comment
Он пытается использовать вычисляемые поля базы данных. NotMapped не поможет ему в этом. - person Tory Netherton; 27.01.2014
comment
да. Я сделал. Использование несопоставленного атрибута не поможет ему отображать вычисляемые поля БД в своем приложении, если только он не хочет также вычислять их в своем приложении. - person Tory Netherton; 29.01.2014