Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq / 14 сообщений из 14, страница 1 из 1
19.10.2010, 12:58
    #36907295
palich12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
Есть таблица, на ней есть вьюха, чтобы можно было работать с вьюхой как с таблицей написан триггер на INSERT.
Проблема в том, что когда в с помощью Linq добавляется таблица во вьюху, то в объекте не появляется его Id а при вставке в таблицу появляется.
Вопрос: Как красиво получить Id новой записи из вьюхи

Если нужно, вот код триггера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
CREATE TRIGGER [dbo].[trgrInsertToFullEoI] ON [dbo].[FullEoI]
WITH EXECUTE AS CALLER
INSTEAD OF INSERT
AS
    DECLARE @pPublicObjectID    int                ,
            @pLogName    nvarchar( 1024 )           ,
            @pServiceID    int                       ,
            @pClass    nvarchar( 255 )               ,
            @pOrganizationID    int               ,
            @pCreateDate    datetime           ,
            @pPublic    bit                       ,
            @pPublicDate    datetime           ,
            @pDeadLine    datetime               ,
            @pAuthorID    int                       ,
            @pTag    nvarchar( 255 )               ,
            @pProfileID int                     ,
            @pMessage nvarchar( 1024 )         ,
            @pCompany    nvarchar( 500 )         ,
            @pContact    nvarchar( 500 )         ,
            @pCountryID    int                     ,
            @pIndex    nvarchar( 18 )             ,
            @pCity    nvarchar( 100 )             ,
            @pAddress    nvarchar( 500 )         ,
            @pTelephone    nvarchar( 100 )         ,
            @pFax    nvarchar( 100 )             ,
            @pEmail    nvarchar( 100 )             ,
            @pContactMethod    int    

    DECLARE CursorOfInserted CURSOR FOR
        SELECT    LogName,
                OrganizationID,
                CreateDate,
                [Public],                
                AuthorID,
                ProfileID, 
                [Message],
                Company,
                Contact,
                CountryID ,
                [Index],
                City,
                Address,
                Telephone,
                Fax,
                Email,
                ContactMethod
        FROM inserted
    IF (@pServiceID IS NULL)
        SET @pServiceID =  6 
    OPEN CursorOfInserted
    FETCH NEXT FROM CursorOfInserted 
    INTO        @pLogName,
                @pOrganizationID,
                @pCreateDate,
                @pPublic,
                @pAuthorID,
                @pProfileID, 
                @pMessage,
                @pCompany,
                @pContact,
                @pCountryID,
                @pIndex,
                @pCity,
                @pAddress,
                @pTelephone,
                @pFax,
                @pEmail,
                @pContactMethod
    SET @pClass = 'Expression of Interest'
    SET @pServiceID =  6 
    SET @pPublicDate = GETDATE()
    WHILE @@FETCH_STATUS =  0  
    BEGIN        
        EXECUTE dbo.InsertToPublicObject @pLogName, @pServiceID, @pClass, @pOrganizationID, @pCreateDate, @pPublic, @pPublicDate, @pDeadLine, @pAuthorID, @pTag
     
        SELECT @@IDENTITY AS PublicObjectID
        FROM dbo.PublicObject

        SET @pPublicObjectID = @@IDENTITY
        
        INSERT 
        INTO dbo.EoI (    PublicObjectID, 
                        ProfileID, 
                        Message,
                        Company,
                        Contact,
                        CountryID,
                        [Index],
                        City,
                        Address,
                        Telephone,
                        Fax,
                        Email,
                        ContactMethod) 
        VALUES (@pPublicObjectID,
                @pProfileID, 
                @pMessage,
                @pCompany,
                @pContact,
                @pCountryID,
                @pIndex,
                @pCity,
                @pAddress,
                @pTelephone,
                @pFax,
                @pEmail,
                @pContactMethod)
        FETCH NEXT FROM CursorOfInserted 
        INTO    @pLogName,
                @pOrganizationID,
                @pCreateDate,
                @pPublic,
                @pAuthorID,
                @pProfileID, 
                @pMessage,
                @pCompany,
                @pContact,
                @pCountryID,
                @pIndex,
                @pCity,
                @pAddress,
                @pTelephone,
                @pFax,
                @pEmail,
                @pContactMethod
    END
    CLOSE CursorOfInserted
    DEALLOCATE CursorOfInserted
GO
...
Рейтинг: 0 / 0
19.10.2010, 14:09
    #36907493
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
Заложите логику триггера в метод с контекстом. Триггер - убрать.
...
Рейтинг: 0 / 0
19.10.2010, 14:25
    #36907553
palich12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
МСУЗаложите логику триггера в метод с контекстом. Триггер - убрать.
Что значит в метод? Если Вы имели ввиду хранимую процедуру, то да это выход, но хотелось бы более красиво сделать. Если вы имели ввиду метод в коде проги, то этого сделать нельзя, доступна только вьюха. Собственно инсерт можно SQL'ем сделать, но хочется раз уж пишешь на Linq, то всё на Linq делать.
...
Рейтинг: 0 / 0
19.10.2010, 14:29
    #36907569
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
palich12Что значит в метод?
То и значит в метод. Что тут не ясного-то?

palich12Если Вы имели ввиду хранимую процедуру, то да это выход
Я имел ввиду, отдельный C# код. Хранимая процедура тоже подойдёт.

palich12но хотелось бы более красиво сделать.
Красиво - это без триггера.

palich12Если вы имели ввиду метод в коде проги, то этого сделать нельзя, доступна только вьюха.
Тогда Ваша задача не решается. Вы идёте в обход ORM.

palich12Собственно инсерт можно SQL'ем сделать, но хочется раз уж пишешь на Linq, то всё на Linq делать.
О том и речь. Если юзаете ORM - значит делайте все телодвижения в ней. Триггер - в топку.
...
Рейтинг: 0 / 0
19.10.2010, 14:44
    #36907612
palich12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
МСУ,

Хорошо, то есть Вы хотите сказать, что Linq to SQL не умеет использовать SCOPE_IDENTIFITY ??
или во всяком случае не применяет их для вьюх.

З.Ы.
Причем здесь ORM, есть источник данных, вьюха, есть объект который с ней работает. Причем здесь триггер, его вобще не видно на уровне кода и соответсвенно ORM, он работает только на уровне СУБД и виден только её админу.

И.М.Х.О.
Если эта проблема не имеет решения без метода или процедуры, то это косяк Linq to SQL, но скорее всего это сделать можно.
...
Рейтинг: 0 / 0
19.10.2010, 14:47
    #36907619
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
palich12Хорошо, то есть Вы хотите сказать, что Linq to SQL не умеет использовать SCOPE_IDENTIFITY ??
Я хочу сказать, что Ваша задача с триггером + Linq To SQL не решается. Не более того.

Во всём остальном Вам поможет профайлер.
...
Рейтинг: 0 / 0
19.10.2010, 14:54
    #36907644
palich12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
Параллельное обсуждение идет на
http://social.msdn.microsoft.com/Forums/ru-RU/fordataru/thread/9f938e95-eb89-4176-a085-37cac6793cbe
из него видно что в целом Linq использует SCOPE_IDENTITY(), но не хочет его использовать в этом конкретном случае, видимо косяк, как там предполагают, в модели БД построенной в Linq. Так что возможно решение есть.
...
Рейтинг: 0 / 0
19.10.2010, 14:59
    #36907666
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
Нужно смотреть не обсуждения, а в профайлер.
...
Рейтинг: 0 / 0
27.10.2010, 11:53
    #36922294
palich12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
МСУНужно смотреть не обсуждения, а в профайлер.
Profiler посмотрел, запрос в нем выглядит достаточно просто:
Код: plaintext
1.
INSERT INTO [dbo].[FullEoI]([PublicObjectID], [LogName], [OrganizationID], [CreateDate], [Public], [AuthorID], [ProfileID], [Message], [Address], [City], [Company], [Contact], [ContactMethod], [CountryID], [Email], [Fax], [Index], [Telephone])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16, @p17)
Собственно [PublicObjectID] это идентификатор, который вставляться не должен, но есть т. к. в схеме БД не стоит Auto Generated Value, а если его поставить то VS падает с ошибкой base {System.SystemException} = {"Заданное приведение является недопустимым."}, но запрос проходит и в нем нет [PublicObjectID] но SCOPE по прежнему не появляется.
...
Рейтинг: 0 / 0
28.10.2010, 11:15
    #36924924
palich12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
Где же ты, МСУ !?
...
Рейтинг: 0 / 0
28.10.2010, 11:24
    #36924950
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
Стал реже бывать - бросил курить. Ем никоретто, помогает. Моск должен отдохнуть от умных вопросов. Поэтому пока ударился в питьё кефира по утрам и в холивар на других форумах :)
...
Рейтинг: 0 / 0
22.11.2010, 11:20
    #36969155
palich12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
И так результатом обсуждения в этой теме
http://social.msdn.microsoft.com/Forums/ru-RU/fordataru/thread/9f938e95-eb89-4176-a085-37cac6793cbe
Стало то, что требуемого результата можно добиться только при помощи хранимых процедур, так что если кто-то столкнулся, то готовьтесь писать хранимки
...
Рейтинг: 0 / 0
22.11.2010, 12:57
    #36969460
Верблюд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
palich12 Стало то, что требуемого результата можно добиться только при помощи хранимых процедур, так что если кто-то столкнулся, то готовьтесь писать хранимки

И правильно. Ибо триггеры - зло. А при правильном подходе к постановке задачи - и реляционная база тоже зло. Вместе с ORM.
...
Рейтинг: 0 / 0
22.11.2010, 14:34
    #36969734
уТКа
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq
Верблюд,

Бугагашечка.

кто ж тебе мешает, храни данные тогда в текстовый файлах, желаю удачи.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Как узнать присвоенный Id только что вставленной записи через тригер спомощью Linq / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]