Как бороться с «вычисляемым» свойством в Entity Framework 4.1? - PullRequest
3 голосов
/ 30 июля 2011

У меня есть модель, как показано ниже:

public class Post
{
    public int Id {get;set;}
    public virtual ICollection<Comment> Comments {get;set;} 
    public virtual ICollection<Reader> Readers {get;set;}
    public int Value {get;set;}
}

Правило: Value = Comments.Count * 2 + Readers.Count.

Как правильно и удобно работать ссвойство «computed» значения «Value»?

Я думаю, что лучше всего вычислять и сохранять «Value» автоматически, когда «Комментарии» или «Читатели» добавляют / удаляют элемент.

, но«DatabaseGeneratedAttribute» здесь бесполезен.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 30 июля 2011

Это не поддерживается.Невозможно сделать Value доступным для запросов linq-to-entity, если он не сопоставлен со столбцом базы данных.В случае EF, использующего EDMX для отображения, это иногда может быть решено с помощью настраиваемой отображенной функции SQL или определяемой моделью функции , но сопоставление кода вначале ничего этого не поддерживает.Другой способ - создать представление базы данных и отобразить вашу сущность для просмотра, но в этом случае сущность будет доступна только для чтения.

Как только вы используете код .NET для определения значения, это всегда только свойство на стороне клиента, вычисленное из данных, загруженных избаза данных.Если вы не хотите пересчитывать свойство каждый раз, когда вам нужны наблюдаемые коллекции, обработчик событий изменяет предварительно вычисленное значение при каждом изменении коллекции. Атрибут

DatabaseGenerated просто помечает ваше свойство как сгенерированное базой данных - в таком случае выне может изменить свое значение, и база данных должна гарантировать, что правильное значение будет сохранено в вашей таблице.

3 голосов
/ 30 июля 2011

Я думаю, что значение вашего столбца основано на двух сопоставленных свойствах. Используйте NotMappedAttribute , чтобы исключить свойство из схемы базы данных и загрузить значения во время выполнения.

public class Post
{
     public int Id {get;set;}
     public virtual ICollection<Comment> Comments {get;set;} 
     public virtual ICollection<Reader> Readers {get;set;}

     [NotMapped]
     public int Value 
     {   
       get return Comments.Count * 2 + Readers.Count;
     }
 }
0 голосов
/ 24 апреля 2015

Вы можете использовать атрибут DatabaseGenerated, а затем создать триггеры в БД для расчета Value. Вы можете создать триггеры в миграциях или метод db seed.

...