Entity Framework Code Первые вычисленные свойства - PullRequest
19 голосов
/ 16 мая 2011

Я использую 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; }
}

Ответы [ 2 ]

33 голосов
/ 16 мая 2011

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

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

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

2 голосов
/ 21 июня 2013

Существует также несколько других опций.

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

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

...