Как мне получить доступ к вычисляемому столбцу в Entity Framework Code First? - PullRequest
10 голосов
/ 04 августа 2011

Я использую Entity Framework Code First в своем приложении ASP.NET MVC.В одном из моих классов есть несколько столбцов, которые складываются вместе.Я храню эти столбцы как вычисляемые столбцы в таблицах, запустив сценарий изменения таблицы в инициализаторе базы данных.Допустим, класс выглядит так:

public class Bond
{
        public decimal ParAmountOfIssuance { get; set; }
        public decimal AccruedInterest { get; set; }
        public decimal Premium { get; set; }
        public decimal OriginalIssueDiscount { get; set; }
}

Сценарий alter выглядит примерно так:

alter table Bonds
add TotalSources as (ParAmountOfIssuance + AccruedInterest + Premium - OriginalIssueDiscount)

Я хочу, чтобы столбец Total Sources был доступен для просмотра в веб-приложении.Какой лучший способ сделать это?Атрибут [DatabaseGenerated(DatabaseGeneratedOption.Computed)] не работает, поскольку EF Code First создает таблицу из класса до запуска сценария alter.

Любые предложения приветствуются.

Ответы [ 3 ]

12 голосов
/ 09 августа 2011

У меня есть какой-то обходной путь.

Вы можете использовать вычисляемое поле только в существующей базе данных.

Если вы добавите свою собственность в объект CF как:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public decimal TotalSources { get; set; }

и если вы добавите в свой скрипт строку, которая удалит информацию о создании этой базы данных:

DELETE FROM [dbo].[EdmMetadata]

CF предположит, что это существующая база данных, и она будет работать, я только что попробовал.

ОБНОВЛЕНИЕ Я забыл, если вы добавляете свойство к вашей сущности Бонда, как это, то в вашем скрипте вам нужно изменить его, чтобы он рассчитывался, а не добавлять :) Вы даже можете вручную «синхронизировать» базу данных и модель - в тот момент, когда у вас все работает без этого поля, добавить его в модель как вычисленную и в таблицу как вычисленную. Когда вы удаляете хеш из таблицы метаданных edm, CF будет работать, не пытаясь восстановить модель с базой данных.

6 голосов
/ 09 августа 2011

Это , безусловно, не поддерживается - определение параметра Computed для пользовательского свойства вызовет исключение.Сначала код = логика в коде.Если вам нужны пользовательские вычисляемые свойства, сначала используйте базу данных.Единственная логика базы данных, поддерживаемая кодом в первую очередь, - это столбец идентификаторов и метка времени.

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

0 голосов
/ 04 августа 2017

Я делаю вычисляемые столбцы в CF (WinForms) следующим образом (я не знаю, лучший ли это):

Это один объект:

public class Result
{
    public int ResultId { get; set; }
    public int StudentId { get; set; }
    public Student Student { get; set; }
    public float Arabic { get; set; }
    public float English { get; set; }
    public float Math { get; set; }
    public float Science { get; set; }
    public float Total { get; set; }
}

ЭтоФорма 2:

    private void Form2_Load(object sender, EventArgs e)
    {
        Model1 model = new Model1();//Model1 : DbContext
        model.Database.CreateIfNotExists();
        model.Database.ExecuteSqlCommand("alter table Results drop column Total; alter table Results add Total AS (Arabic + English + Math + Science)");

        var r1 = (from s in model.Students
                  join r in model.Results
                  on s.StudentId equals r.StudentId
                  select new { s.StudentName, r.Arabic, r.English, r.Science, r.Math, r.Total }).ToList();
        dataGridView1.DataSource = r1;
    }
...