|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
Есть таблица Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
в ней есть такой вот тригер Код: sql 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.
С тригера понятно что при инсерте делается проверка по нескольким ключам и если есть совпадение делается апдейт вместо инсерт При работе через Entity Framework при попытке инсерта данные которые отвечают условиям тригера вываливается ошибка The element at index 0 in the collection of objects to refresh is in the added state. Objects in this state cannot be refreshed. есть идеи как можно обойти проверку на данные которые он пытается вставить а точнее отключить проверку? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2013, 12:47 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
не та ошибка простите, вот правильная Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2013, 12:51 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
1. Судя по телу триггера база не заточена на работу с ней к.л. другого приложения... 2. Триггер нах. 3. Ваш мердж не изменил ни одной записи... ? 4. select в триггере - это 3.14здец Может я что-то забыл... 5. не стоит размазывать логику между базой и клиентом... т.е. иногда без этого ни как, но, в любом случае, делать это нужно аккуратно. P.S.: это мнение дилетанта... т.е. это набор мыслей что пронеслись бы в моей голове увидь я этот код в первый раз... до начала детального разбирательства... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2013, 13:16 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
buser1. Судя по телу триггера база не заточена на работу с ней к.л. другого приложения... 2. Триггер нах. 3. Ваш мердж не изменил ни одной записи... ? 4. select в триггере - это 3.14здец Может я что-то забыл... 5. не стоит размазывать логику между базой и клиентом... т.е. иногда без этого ни как, но, в любом случае, делать это нужно аккуратно. P.S.: это мнение дилетанта... т.е. это набор мыслей что пронеслись бы в моей голове увидь я этот код в первый раз... до начала детального разбирательства... 1. Я так и не понял что вы пытались сказать 2. Если бы можно было Нах то так бы и сделал 3. Изменил но вопрос не в том 4. Это необходимость для ЕФ 5. Если вопрос стоит так что для поверки существующих данных придется перетянуть 800 000 рекордов то стоит (и это для малой базы) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2013, 13:22 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
А Вы можете запустить профайлер и посмотреть на трассу при update? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2013, 14:11 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
Т.е. insert ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2013, 14:12 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
P.S.: попробуйте переписать триггер... т.е. избавтесь от select Id from [TradingData].[Security] where @@ROWCOUNT > 0 and Id = scope_identity(); Заменив на output во времянку с финальным селектом из нее же... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2013, 15:06 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
автор, EF не читан. то что сыпется в бд при insertexec sp_executesql N'insert [dbo].[Security]([Isin], [Ric], [Mic], [Sedol], [BftId], [Name], [LongName], [ClassId], [CurrencyId], [EconomicSectorId], [CountryId], [ParentId], [ParentIdentify], [ParentIdentifyType]) values (@0, @1, null, null, null, null, null, null, null, null, @2, null, null, null) select [Id] from [dbo].[Security] where @@ROWCOUNT > 0 and [Id] = scope_identity()',N'@0 varchar(20),@1 varchar(20),@2 int',@0='zzz',@1='qweqw',@2=1 обрати внимание на scope_identity() в этой кучке букв оно возвратит NULL на втором вызове savechanges если сделать последовательно var z = new Security() { Isin = "234t", Ric = "23t", CountryId = 21 }; ctx.Security.Add(z); ctx.SaveChanges(); ctx.Security.Add(z); ctx.SaveChanges(); EF решает что ничего вставлено не было. и говорит тебе об этом. кстати, даже если его заменить каким-то перцем на @@identity работать оно в приведенной последовательности команд не будет. var z = new Security() { Isin = "234t", Ric = "23t", CountryId = 21 }; ctx.Security.Add(z); // в identity map нет обьекта с ключем по умолчанию для создаваемых обьектов ctx.SaveChanges(); // теперь он в identity map со сгенеренным ключем. ctx.Security.Add(z); // тут ошибка будет т. к. в identity map будет существовать обьект с таким ключемю ctx.SaveChanges(); -- схему переделывать. EF по разному ведет себя в случае insert/update/delete а вы взяли и сделали не то чего он ожидает. можно сделать на хранимках требуемое. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2013, 21:55 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
HiTechAnarxi, Нужно вернуть для EF inserted.id вставьте в insert после перечисления колонок следующую красную строчку: INSERT (Isin,Ric,Sedol,Mic,BftId,Name,LongName,ClassId,CurrencyId,EconomicSectorId,CountryId,ParentId,ParentIdentify,ParentIdentifyType) OUTPUT INSERTED.Id select Id from [TradingData].[Security] where @@ROWCOUNT > 0 and Id = scope_identity(); ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 02:42 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
Такая же проблема, какое было решение в Вашем случае EF генерит такой запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
если выполнять его "вручную" все работает, EF 6 выдает Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 17:46 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
а зачем кусать кактус? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 21:16 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 21:20 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
Andrey1306kmaw, Это длинная история начиналась она тут тогда можно было это реализовать, забив на мейнстрим. давно ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 21:22 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
kmawAndrey1306kmaw, Это длинная история начиналась она тут тогда можно было это реализовать, забив на мейнстрим. давно Подскажите как ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2014, 21:26 |
|
Entity Framework + INSTEAD OF INSERT trigger + update action
|
|||
---|---|---|---|
#18+
HiTechAnarxiС тригера понятно что при инсерте делается проверка по нескольким ключам и если есть совпадение делается апдейт вместо инсерт При работе через Entity Framework при попытке инсерта данные которые отвечают условиям тригера вываливается ошибка Вот я пытаюсь представить как это выглядит на стороне приложения: 1) Приходит некоторый сигнал с набором параметров 2) открывается контекст EF 3) в него добавляется новый объект, полям присваиваются параметры 4) делается SaveChanges, чтобы отправить insert в базу 5) В триггере insert заменяется на апдейт из-за этого EF ломается ибо на insert он ожидает добавление объекта. Внимание вопрос, зачем тут EF и мапинг на объекты? Сделайте процедуру, которая делает "upsert", дергайте её через DbContext.Database.ExecuteSqlCommand, тогда все ваше приложение будет выгладеть так: 1) Приходит некоторый сигнал с набором параметров 2) Открывается контекст EF 3) Вызывается процедура 4) Процедура делает upsert И триггеры, особенно такие нетривиальные, не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 01:34 |
|
|
start [/forum/topic.php?fid=17&msg=38167897&tid=1349740]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 143ms |
0 / 0 |