Принудительное использование LINQ хранимой процедуры при доступе к базе данных. - PullRequest
2 голосов
/ 23 ноября 2010

Я сделал несколько поисков (через Интернет и SO), но до сих пор не смог найти что-то, что прямо отвечает на это:

Есть ли в любом случае заставить L2S использовать хранимую процедуру при доступе к базе данных?

Это отличается от простого использования SPROC с L2S: дело в том, что я полагаюсь на LINQ, чтобы лениво загружать элементы путем доступа через сгенерированное «дочернее свойство». Если я использую SPROC для получения элементов одной таблицы, затем сопоставляю их с сущностью в LINQ, а затем получаю доступ к дочернему свойству, я считаю, что LINQ будет извлекать регистр из БД с использованием динамического sql, что противоречит моей цели.


UPDATE:

Извините, если текст выше не понятен. Что я действительно хочу, так это что-то вроде «Методы по умолчанию» для Обновления, Вставки и Удалить, однако, для Выбора. Я хочу, чтобы каждый доступ осуществлялся через SPROC, но я хочу использовать Child Property.

Просто, чтобы вы не думали, что я сумасшедший, дело в том, что мой DAL создается с использованием дочерних свойств, а я обращался к базе данных через L2S с использованием динамического SQL, но на прошлой неделе клиент сказал мне, что все базы данных имеют доступ должно быть сделано через SPROCS.

Ответы [ 3 ]

3 голосов
/ 23 ноября 2010

Я не верю, что есть какой-то переключатель или настройка, которые из коробки и автоматически будут отображаться с использованием t sprocs, как вы описываете. Но теперь есть причина, по которой вы не можете изменить сгенерированный файл DBML так, как вам нужно. Если бы у меня было две связанные таблицы, таблица Каталога и таблицы CatalogItem, генератор Linq2SQL естественным образом предоставил бы мне свойство CatalogItems в Каталоге, например:

private EntitySet<shelf_myndr_Previews_CatalogItem> _shelf_myndr_Previews_CatalogItems;

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="CatalogItem", Storage="_CatalogItems", ThisKey="Id", OtherKey="CatalogId")]
public EntitySet<CatalogItem> CatalogItems
    {
        get
        {
            return this._CatalogItems;
                            //replace this line with a sproc call that ultimately
                            //returns the expected type
        }
        set
        {
            this._CatalogItems.Assign(value);
                            //replace this line with a sproc call that ultimately
                            //does a save operation
        }
    }

Ничто не мешает вам изменить этот код так, чтобы он вызывал sproc там. Для более крупных приложений потребуются некоторые усилия, и я уверен, что вы получите от этого выгоду, которую, по вашему мнению, получите.

1 голос
/ 23 ноября 2010

Как насчет загрузки дочерних сущностей с использованием частичного метода OnLoaded () в родительской сущности? Это позволит вам избежать путаницы с сгенерированным кодом. Конечно, это больше не будет ленивая загрузка, но это простой способ сделать это.

Например:

public partial class Supplier
{
    public List<Product> Products { get; set; }

    partial void OnLoaded()
    {
        // GetProductsBySupplierId is the SP dragged into your dbml designer
        Products = dataContext.GetProductsBySupplierId(this.Id).ToList();
    }
}
0 голосов
/ 23 ноября 2010

Назовите вашу хранимую процедуру следующим образом:

alt text

Где GetProductsByCategoryName - название вашей хранимой процедуры.

http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...