значение из вычисляемого свойства базы данных равно Null в свойстве кодовой сущности

В моей таблице базы данных MS SQL 2014 есть столбец вычисляемых свойств, который использует функцию базы данных. Используя SQL Server Management Studio, запрос к таблице выводит список вычисленных значений свойств, как и ожидалось.

Модель Codefluent, созданная с помощью мастера импорта, показывает Entity с вычисляемым столбцом в качестве свойства. Базовый файл .cpf определяет свойство с помощью "d3p1:compute=" и список параметров, используемых функцией базы данных.

Когда сущность или коллекция сущностей загружаются, свойства, которые используются в вычисляемом свойстве, имеют значения, но вычисляемое свойство имеет значение ничего/нуль.

Как заставить Codefluent считать вычисленное значение из таблицы базы данных и включить это значение в свойства сущности?


person Greg Delaney    schedule 06.09.2016    source источник


Ответы (2)


Это немного сложно. Прежде всего, вы должны объявить свойство, как и любое другое свойство. Затем вы должны указать производителю SQL объявить формулу для этого столбца. Вы можете сделать это с помощью пользовательского атрибута «compute» в пространстве имен производителя SQL. Вы можете установить его с помощью средства моделирования Visual Studio следующим образом:

введите здесь описание изображения

В этом примере я создал свойство int, которое представляет собой еще одно значение столбца, умноженное на 2.

При желании вы можете объявить свойство «читаемым при сохранении», потому что в большинстве случаев вы хотите прочитать вычисленное значение после сохранения, а не только при операциях загрузки:

введите здесь описание изображения

Как только все это будет сделано, в этом образце консольного приложения должно отображаться 30:

class Program
{
    static void Main(string[] args)
    {
        var c = new Customer();
        c.Name = "killroy";
        c.Age = 15;
        c.Save();
        Console.WriteLine(c.Age2); // will display 30
    }
}
person Simon Mourier    schedule 06.09.2016
comment
Спасибо за направление! Опционально... чтение при сохранении... было установлено в True после того, как я импортировал таблицу в модель. Я пытался изменить некоторые свойства true/false элемента, но безрезультатно. Функция базы данных довольно сложна, и я не уверен, как переписать ее, чтобы она соответствовала ячейке значения атрибута для вычислений. Я думаю, что мог бы написать фрагмент OnGet, чтобы он соответствовал функции базы данных. Поскольку базовые значения сохраняются в строке базы данных, другие приложения, использующие базу данных, будут иметь вычисленное значение, а также приложения CF. - person Greg Delaney; 06.09.2016

Если решение Саймона Мурье решает вашу проблему, то это, вероятно, лучший подход. Однако есть еще 2 варианта

  1. Метод просмотра RAW

После того, как вы создадите представление объектов Codefluent, нажмите кнопку «Редактировать где», и это позволит вам создать представление RAW.

введите здесь описание изображения

Затем вы можете указать расширенное свойство «UsedForMethods».

ВНИМАНИЕ! Связанные объекты будут использовать таблицу вместо представления. Это сделано намеренно, и где-то в центре знаний есть статья о том, как это обойти. http://www.softfluent.com/product/codefluent-entities/knowledge-center/

введите здесь описание изображения

  1. Переименовать таблицы SQL и создать представление SQL с тем же именем, что и у исходной таблицы. Этот метод является хаком, Softfluent не одобряет этот подход, мне он нравится, потому что я точно знаю, что происходит под сценой. Я успешно использовал его в сценарии, в котором мне нужно было мягкое удаление. Я автоматизировал процесс с помощью двух хранимых процедур, которые обрабатывают переименование. Использование этого подхода требует запуска одной из хранимых процедур для отмены изменения имени перед построением модели. Другая хранимая процедура обрабатывает переименование после построения модели. Я опубликую хранимые процедуры и то, как я их использую, через пару дней.
person Dave    schedule 06.09.2016
comment
Спасибо и за ваши предложения! - person Greg Delaney; 06.09.2016
comment
Как я сказал Саймону, я думаю, что мог бы написать фрагмент OnGet, соответствующий функции базы данных. Поскольку базовые значения сохраняются в строке базы данных, другие приложения, использующие БД, будут иметь вычисленное значение, и приложения CF также будут иметь его. - person Greg Delaney; 06.09.2016