ADO.NET EF + CF: как использовать существующий контекст CF и связывать внешние объекты SQL (представления, хранимые процедуры и т. Д.)? - PullRequest
1 голос
/ 23 февраля 2012

У меня есть база данных, 90% созданная с помощью EF 4.1 + Code First подход на SQL Server 2012;остальное генерируется некоторым кодом SQL (ФУНКЦИИ, ВЫЧИСЛЕННЫЕ КОЛОННЫ, ВИДЫ, ИНДЕКСЫ, И Т.Д.).

Теперь мне нужно было использовать ObjectContext и одновременно оптимизировать производительность поэтому я создал несколько SQL Views непосредственно в БД, которые в основном выполняют некоторые вычисления (подсчет, смешивание, сумма и т. д.) для уже сгенерированных таблиц CF.

Я хотел бы использовать вышеупомянутые «внешние» представления SQL внутри моего решения, возможно, указывая на такую ​​же строку подключения моего контекста CF и используя тот же репозиторий, который я создал.Мне удалось создать ADO.NET EDM для Views (это правильный подход?), Так что теперь у меня есть Entity Model, сгенерированная из db.По причинам, описанным выше, вначале я использовал существующее соединение для передачи данных и решил не сохранять дополнительную строку соединения внутри моего web.config.

Теперь у меня есть edmx, содержащий мой Modelи мои Model.Store из "внешних" взглядов.Например, вот выдержка из mymodel.Designer.cs , которая кажется стандартной, которую я видел в других edmx других проектов:

 public partial class Entities : ObjectContext
{
    #region Constructors

    /// <summary>
    /// Initializes a new Entities object using the connection string found in the 'Entities' section of the application configuration file.
    /// </summary>
    public Entities() : base("name=Entities", "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new Entities object.
    /// </summary>
    public Entities(string connectionString) : base(connectionString, "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    /// <summary>
    /// Initialize a new Entities object.
    /// </summary>
    public Entities(EntityConnection connection) : base(connection, "Entities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

    #endregion
    .............

Я бы хотелзапросить «внешние» объекты.Я сделал несколько тестов, но мне не удалось.Не могли бы вы сказать мне правильный подход к проблеме, пожалуйста?

1) Это один из тестов, которые я сделал.В этом случае я получаю исключение «Указанное именованное соединение либо не найдено в конфигурации, либо не предназначено для использования с поставщиком EntityClient, либо недопустимо»:

 public class TManagerRepository : ITManagerRepository, IDisposable
   {
    private TManagerContext context; // the context pointing to CF entities
    private TManager.Models.Entities.SQL_Views.Entities entities; // the context pointing to the SQL views by the EDM

    public TManagerRepository(TManagerContext context)
    {
        this.context = context;
        this.entities = new TManager.Models.Entities.SQL_Views.Entities();

        var test = (from d in this.entities.myview
                        select d); 
    }

2) Затем я попыталсяустановить конкретное соединение, но я получаю исключение, которое говорит: «Не удалось найти концептуальную модель для проверки».

Большое спасибо за вашу драгоценную помощь!

С наилучшими пожеланиями

1 Ответ

1 голос
/ 23 февраля 2012

Нельзя использовать одну и ту же строку подключения для первого подхода к коду и для EDMX. Обязательные строки подключения имеют другой формат. Поэтому, если вы не хотите сохранять строку подключения для контекста EDMX в файле конфигурации, вам необходимо создать ее вручную .

...