EF Создать базу данных из модели удаляет импорт функций - PullRequest
1 голос
/ 06 августа 2011

Хорошо, я видел этот вопрос Entity Framework: Генерация базы данных из модели удаляет хранимые процедуры из хранилища моделей , но я не думаю, что это решается. У меня есть некоторые функции, которые мне нужно запустить в SQL Server в выборе для фильтрации. Я не смог написать этот код в .NET, поэтому я просто написал эту функцию в SQL Server как функцию. Я использую модель сначала, но мне нужна эта функция на уровне SQL, и я использую опцию обновления модели из базы данных, чтобы импортировать функцию. Но когда я делаю изменения в Entity Designer и генерирую базу данных из модели, отображение функций стирается. Я понимаю, что не должен использовать модель-сначала и db-сначала одновременно, но как я могу решить свою проблему тогда? У меня есть этот код, который я не могу написать на C #, и он мне нужен в моих запросах LINQ. Он работает, когда я создаю импорт и создаю метод C # с атрибутом EdmFunction, который отображается на функцию в базе данных, но как я могу сделать ее постоянной, чтобы связь между моей моделью и моей функцией SQL сохранялась при обновлении? Является ли единственной возможностью написать функцию, которая может переводиться в LINQ-to-Entities?

Вот моя функция SQL

    create function [dbo].[HammingDistance]
    (@first bigint, @second bigint) returns int
    as
    begin
        declare @xor bigint = @first ^ @second;
        declare @one bigint = 1;
        declare @diff int = 0;
        declare @and bigint;
        while (@xor != 0)
            begin
            set @and = @xor & @one;
            if(@and = @one)
                begin
                set @diff = @diff + 1;
                end
            set @xor = @xor / 2;
            end
        return @diff;
    end

(я не эксперт по SQL, возможно, это не лучший способ сделать это, поэтому, если есть лучший способ, поправьте меня)

Мне нужно, чтобы это работало в базе данных БЕЗ импорта чего-либо в ASP.NET из БД. Если у вас есть способ перевести этот код в C #, который будет переводиться в код SQL в LINQ-to-Entities, это также приветствуется.

1 Ответ

0 голосов
/ 06 августа 2011

Читали ли вы ответ в связанном вопросе? Здесь нечего решать. Это просто не поддерживается дизайнером. База данных сначала и модель первые подходы являются эксклюзивными. Вы можете использовать любой второй, но их объединение не является рабочим процессом использования конструктора.

Что вы можете сделать? Вы можете написать свой собственный рабочий процесс создания базы данных - вы найдете рабочий процесс по умолчанию здесь:

%VSINSTALLDIR%\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\TablePerTypeStrategy.xaml

Вам нужно заменить первое действие своим, которое поместит импорт вашей функции в SSDL после генерации. Вы также можете попробовать использовать Блок питания для генерации базы данных , который предлагает больше функциональных возможностей для генерации базы данных, и среди этих функций есть шаблоны T4 для генерации SSDL, где импорт функции жесткого кодирования должен быть намного проще, чем создание операций рабочего процесса.

Наконец, вы можете потратить немного денег и купить инструмент, который позволит вам творить гораздо больше волшебства, чем предлагает вам стандартный дизайнер. Вы можете попробовать пробную версию Huagati EDMX tools и его модель сравнения .

Btw. почему вы сначала используете модель? Сначала модель, а сначала код, предназначены для сценариев, в которых вы не беспокоитесь о скупой базе данных, сгенерированной для вас, и где самой сложной логикой в ​​базе данных является автоматически сгенерированный идентификатор.

По моему мнению, модель сначала или код сначала не предназначены для реального приложения, где вы ожидаете чего-то большего, чем глупое сохранение данных с небольшим объемом данных, небольшим трафиком и абсолютно никакой логикой в ​​базе данных. Да, ваш сценарий находится вне области применения модели в первую очередь = вы используете неправильный рабочий процесс, не ожидаемый разработчиком MS.

...