Самый эффективный способ автоматического подключения внешнего ключа в LINQ - PullRequest
0 голосов
/ 19 июня 2009

У меня есть две таблицы для отслеживания пользовательских сессий на моем сайте. Это грубое упрощение между прочим:

 Campaign:
     campaignId    [int]
     campaignKey   [varchar(20)]
     description   [varchar(50)]

 Session:
     sessionDate   [datetime]
     sessionGUID   [uniqueidentifier]
     campaignId    [int]
     campaignKey   [varchar(20)]

Я хочу вставить новую запись в сеанс, используя LINQ:

     var s = new Session();
     dbContext.Session.InsertOnSubmit(s);

     s.sessionDate = DateTime.Now;
     s.sessionGUID = Guid.NewGuid();
     s.campaignKey = Request.Params["c"];
     // dont set s.campaignId here...

     dbContext.SubmitChanges();

Обратите внимание, что в данный момент я не устанавливаю campaignId в этом коде.

Я хочу, чтобы что-то автоматически подключило внешний ключ к таблице «Кампания», и что бы оно ни делало, сначала нужно добавить новую строку в таблицу «Кампания», если переданная кампания имеет никогда раньше не использовался.

Мне нужно принять несколько решений, и я был бы очень признателен за понимание любого из них:

  • Я не знаю, должен ли я использовать триггер, сохраненный процесс или делать это в LINQ вручную:

    • Триггер : немного неприлично, им никогда не нравилось пользоваться, но это гарантирует, что «идентификатор кампании» будет обновлен к тому времени, когда он мне понадобится

    • Хранимый процесс : опять-таки немного неприлично, мой SQL не велик, и я ценю постоянство способности делать все в LINQ в максимально возможной степени.

    • Linq вручную : мне нужно было бы сохранить копию таблицы 'Campaign' в памяти и использовать хеш-таблицу C # для поиска. Тогда мне нужно будет следить за актуальностью этой таблицы, если другой клиент добавит новую кампанию.

  • Мои две основные причины, по которым мне нужна эта таблица внешнего ключа, заключаются в более эффективном индексе 'Session' для 'campaignId', чтобы я мог быстрее группировать просто кажется, что это должно быть намного быстрее, если это просто целочисленный столбец, сгруппированный. Вторая причина - предоставить партнерам разрешения на просмотр только их кампаний через объединения с другими таблицами.

Прежде чем кто-либо спросит, я НЕ знаю кампании заранее, так как некоторые из них будут созданы партнерами.

Самое главное: В первую очередь я ищу наиболее «дружественное» для LINQ решение.

1 Ответ

1 голос
/ 26 июня 2009

Я бы определенно рекомендовал добавить ограничение внешнего ключа, допускающее обнуляемость, в таблицу Session. После того, как вы настроите эту настройку, все будет так же просто, как привязать метод к классу Session:

public partial class Session
{
    public void SetCampaignKey(string key)
    {
        // Use an existing campaign if one exists
            Campaign campaign =
            from c in dbContext.Campaigns
            where c.campaignKey == key
            select c;

        // Create a new campaign if necessary
        if (campaign == null)
        {
            campaign = new Campaign();
            campaign.campaignKey = key;
            campaign.description = string.Empty; // Not sure where this comes in
            dbContext.Campaign.InsertOnSubmit(campaign);
        }

        // We can now set the reference directly
        this.Campaign = campaign;
    }
}

Мой LINQ может быть немного выключен, но что-то вроде этого должно работать.

Вы можете вызвать SetCampaignKey () вместо ручной настройки свойства campaignKey. Когда вы вызываете dbContext.SubmitChanges, кампания будет добавлена ​​в случае необходимости, и запись в сеансе будет соответственно обновлена.

В этом случае только свойство campaignId будет установлено автоматически. Вы можете положиться на простой триггер, чтобы установить campaignKey или покончить с ним. Вы всегда можете получить значение, присоединившись к таблице Campaign.

Я упрощаю проблему?

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