Показаны сообщения с ярлыком Entity Framework. Показать все сообщения
Показаны сообщения с ярлыком Entity Framework. Показать все сообщения

среда, 11 января 2017 г.

Entity Framework: порядок команд при сохранении (SaveChanges)

Есть ли порядок выполнения независимых SQL-команд при SaveChanges.

Если коротко: гарантированного порядка нет

материалы по теме

Entity Framework the order sql generated by Savechanges()
http://stackoverflow.com/questions/9537706/entity-framework-the-order-sql-generated-by-savechanges


DbContext SaveChanges Order of Statement Execution
http://stackoverflow.com/questions/7335582/dbcontext-savechanges-order-of-statement-execution


Entity Framework - производительность

Подводные камни Entity Framework и производительность
http://habrahabr.ru/post/269901/

Performance Considerations for Entity Framework 4, 5, and 6
https://msdn.microsoft.com/en-us/data/hh949853.aspx

Entity Framework and AsNoTracking
http://blog.staticvoid.co.nz/2012/4/2/entity_framework_and_asnotracking

Еще один взгляд на Entity Framework: производительность и подводные камни
http://habrahabr.ru/post/164483/

Entity Framework: рецепты повышения производительности
http://bodrocode.blogspot.com/2015/03/entity-framework.html


---

7 Ways to Increase the Performance of Entity Framework
https://www.talksharp.com/increase-enity-framework-performance

--

Профайлер для Entity Framework
http://habrahabr.ru/post/221681/

среда, 26 октября 2016 г.

Entity Framework + Linq группировка по nullable-полю

Окружение

Entity Framework, Linq, C#


Задача

сделать Linq-запрос для Entity Framework с группировкой по навигационному полю, которое может содержать пустые значения (null-значения)


Решение

Идея решения: приведите нуллабле поле к несуществующему значению в рамках таблицы

пример

GroupBy(o => o.Order==null?null:o.Order.ClientId)

или

GroupBy(x => x.Programa == null ? -1 : x.Programa.Id)

Материал по теме

Решение отсюда
http://stackoverflow.com/questions/5782915/groupby-with-id-of-possible-null-object

среда, 30 сентября 2015 г.

Entity Framework: Reload newly created object / Reload navigation properties

Environment

ASP.NET MVC 4 application, EntityFramework 6

Problem


Unable to reload the updated properties of an object from the database, and navigation properties.

Scenario

I do processing Post-request for object creation in the controller's action .
The object itself passed in the Action as parameter.

I usually do this sequence

...
check values
save object
additional actions after saving
...

From the client side a new object comes "clean" / without navigational properties.
I add it to the context and save.
Once saved, I want to do the extra processing in which I need the navigation properties,
but the problem is that EF caches object and reloading does not update the navigation properties. They remain empty.

Solution

Before you read the object from database it must be disconnected from the context.

I got to do it this way:

public void Detach (T entity)
{
            ((IObjectContextAdapter) _db) .ObjectContext.Detach (entity);
}

The solution found here
Entity Framework Code First - No Detach () method on DbContext
http://stackoverflow.com/questions/4168073/entity-framework-code-first-no-detach-method-on-dbcontext

Related Links


Entity Framework Code First - No Detach() method on DbContext
http://stackoverflow.com/questions/4168073/entity-framework-code-first-no-detach-method-on-dbcontext

Reload an entity and all Navigation Property Association- DbSet Entity Framework
http://stackoverflow.com/questions/9081244/reload-an-entity-and-all-navigation-property-association-dbset-entity-framework

How to update an entity's navigation properties in Entity Framework
http://stackoverflow.com/questions/10542209/how-to-update-an-entitys-navigation-properties-in-entity-framework

Entity Framework POCO - Refresh a navigation property
http://stackoverflow.com/questions/3839166/entity-framework-poco-refresh-a-navigation-property

Entity Framework Перезагрузить только что созданный объект/перегрузить навигационные свойства

Окружение

ASP.NET MVC 4 приложение, EntityFramework 6

Проблема

Не получается перезагрузить обновленные свойства объекта из базы данных и навигационные свойства


Сценарий использования

Обрабатываю в контроллере Post-запрос на создание объекта. Объект передается параметром в Экшене.
как обычно я делаю

...
проверки
сохранение объекта
дополнительные действия после сохранения
...

С клиента новый объект приходит "чистым"/ т.е. без навигационных свойств.
Его я и добавляю в контекст и сохраняю.
После сохранения я хочу провести дополнительную обработку в которой мне нужны навигационные свойства, но проблема в том, что EF кеширует объект и повторная загрузка не приводит к обновлению навигационных свойств. Они остаются пустыми.

Решение

Перед тем как считать обновленный объект его нужно отсоединить от контекста.

У меня получилось сделать это так:

public void Detach(T entity)
{
            ((IObjectContextAdapter)_db).ObjectContext.Detach(entity);
}

Решение нашел здесь
Entity Framework Code First - No Detach() method on DbContext
http://stackoverflow.com/questions/4168073/entity-framework-code-first-no-detach-method-on-dbcontext

Ссылки по теме


Entity Framework Code First - No Detach() method on DbContext
http://stackoverflow.com/questions/4168073/entity-framework-code-first-no-detach-method-on-dbcontext

Reload an entity and all Navigation Property Association- DbSet Entity Framework
http://stackoverflow.com/questions/9081244/reload-an-entity-and-all-navigation-property-association-dbset-entity-framework

How to update an entity's navigation properties in Entity Framework
http://stackoverflow.com/questions/10542209/how-to-update-an-entitys-navigation-properties-in-entity-framework

Entity Framework POCO - Refresh a navigation property
http://stackoverflow.com/questions/3839166/entity-framework-poco-refresh-a-navigation-property



вторник, 2 декабря 2014 г.

Entity Framework Странная ошибка Unable to update the EntitySet - because it has a DefiningQuery and no element exist

Ситуация


При сохранении объекта Entity Framework выдал ошибку

Unable to update the EntitySet - because it has a DefiningQuery and no <UpdateFunction> element exist

Текст странный. и поначалу ввел меня в ступор.

Решение


Оказалось, что я забыл установить первичный ключ в таблице. Исправил, обновил модель и все заработало.

среда, 17 сентября 2014 г.

MS SQL использование GUID как первичных ключей (Primary key)

Проблема

В двух словах: планирую новый проект на MS SQL
планируется распределенная структура (несколько баз)
соовтетсвенно в очередной раз возник вопрос: какими должны быть ключевые поля
Int или GUID
(предметно-зависимые отбросил сразу, т.к. на практике ни к чему хорошему не приводило)

распределенная структура располагает с GUID-ключам
но в общем случае при использовании GUID  в лоб появляеются проблемы с производительностью.

Обзор "лучших практик" привел к решению
Последовательные или комбинированные (COMB) гуиды
COMB от NHibernate
или на уровне БД - NEWSEQUENTIALID

все ссылки по тексту ниже.

Разделил их на 4 раздела

1. Базовые знания
2. Исследование вопроса GUID-ов
3. Варианты решений
4. (факультатив) связь с Entity Framework

1. Базовая подготовка по MS SQL / Guid


GUID - вики статья
(вдруг кто не знает)
http://ru.wikipedia.org/wiki/GUID


Описание типа данных uniqueidentifier в MS SQL
Использование данных uniqueidentifier
http://technet.microsoft.com/ru-ru/library/ms190215(v=sql.105).aspx

Функция NEWSEQUENTIALID (Transact-SQL)
описание функции в MS SQL
http://msdn.microsoft.com/ru-ru/library/ms189786.aspx

UuidCreateSequential function
http://msdn.microsoft.com/en-us/library/aa379322(VS.85).aspx

2. Статьи очерчивающие проблемы использвания GUID'ов для первичных ключей


Хорошая статья с замерами
GUID vs INT Debate
http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/guid-vs-int-debate.aspx

Простенькая статья с замерами
Целочисленные, символьные и GUID-ключи в MS SQL
http://www.arbinada.com/main/node/38

Обсуждение отличий в скорости работы обычных гуидов и последовательных
What are the performance improvement of Sequential Guid over standard Guid?
http://stackoverflow.com/questions/170346/what-are-the-performance-improvement-of-sequential-guid-over-standard-guid/170363#170363

Статья отценивающая за и проив гуидов как первичных ключей
есть расчеты и самодельная генерация комбинированных гуидов на стооне сервера.
в двух словах: автор - за комбогуиды
The Cost of GUIDs as Primary Keys
http://www.informit.com/articles/article.aspx?p=25862

Еще статья оценивающая, хорошо ли брать гуиды в качестве первичных ключей
SQL Server: Is it OK to use a uniqueidentifier (GUID) as a Primary Key?
http://mitch-wheat.blogspot.com.au/2011/08/sql-server-is-it-ok-to-use.html

еще обсуждение на Stackoverflow
Про издержки в производительности при использовании гуидов
What are the performance improvement of Sequential Guid over standard Guid?
http://stackoverflow.com/questions/170346/what-are-the-performance-improvement-of-sequential-guid-over-standard-guid/170363#170363

3. Статьи с вариантами решения

Это решение взял за основу
CombGuid. Генерация “дружественных” к SQL серверам значений Guid в .net приложениях
пример самостоятельной генерации (тут логика взята из библиотеки Magnum)
http://habrahabr.ru/post/214667/

Собственно NHibernate'овская реализация Гуидов
(по нему сделано много комбовских реализаций)
https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Id/GuidCombGenerator.cs

Хорошая статья - чуть не взял её за основу
но склонился к NHibernate'овской реализации.
она учитывает 2 аспекта
1. использование функции uuidcreatesequential
2. превращение функции с SQL-server-совместимый формат
http://www.shirmanov.com/2010/05/generating-newsequentialid-compatible.html
Generating NewSequentialID compatible Sequential Guids in C#

обсуждение на stackoverflow
Ищут .NET эквивалент для newsequentialid
Is there a .NET equalent to SQL Servers newsequentialid()
http://stackoverflow.com/questions/211498/is-there-a-net-equalent-to-sql-servers-newsequentialid
тут дали ссылку на PInvoke.net (см. ниже)
но еще есть пример реализации COMB от NHibernate

pinvoke.net
пример адаптации для Net Windows функции uuidcreatesequential (rpcrt4)
http://www.pinvoke.net/default.aspx/rpcrt4.uuidcreatesequential
это годный рабочий пример, но не уверен в дружественности сгенерированных гуидов к MS SQL

еще пример
по сути дублирует код с pinvoke.net
http://www.csharpque.com/2012/06/generating-sequential-guid.html

Немного про взаимодействие с EF


Using sequential guids as identifiers in Entity Framework
http://bartwullems.blogspot.com/2013/10/using-sequential-guids-as-identifiers.html
тут описаны 2 варианта
1. генерация гуида через скл-сервер
2. ссылка на нхибернейтовсую реализацию Comb

Статьи по теме

Пример создания последовательного Guid в базе
MS SQL: Создание нового последовательного Guid


понедельник, 8 сентября 2014 г.

Наследование в MS SQL Server с использованием Entity Framework (EF)

Ситуация 

Созреваю на применение наследования в базе данных. Работаю с MS SQL Server 2008 (планирую переход на 2012)

Моя мотивация: 

в системе есть несколько типов документов, а будет еще больше.
И у всех документов нужны типовые реквизиты:

  • состояние (проведен/не проведен), 
  • дата создания, 
  • автор, 
  • дата изменения, 
  • последний изменивший,
  • пометка удаления


Дублировать эти поля во всех типах документов очень не хочется.
Хотелось бы создать таблицу "Базовый документ" со всеми этими служебными полями и остальные документы наследовать от неё.

Изучение темы

К сожалению, на нашел в MS SQL каких-нибудь стандартных механизмов. Похоже, придется все делать "ручками".

Похоже выбирать буду метод TPT (Table Per Type)

Все материалы привожу ниже

Материалы по теме

Статья про реализацию наследования в БД
Implementing Table Inheritance in SQL Server
тут про бд описано нормально, но не освещено как с этим "взлетать": а именно, как работать в прикладном решении
http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server

Несколько веток на Stackoverflow
How can you represent inheritance in a database?
http://stackoverflow.com/questions/3579079/how-can-you-represent-inheritance-in-a-database

Table “Inheritance” in SQL Server
http://stackoverflow.com/questions/529256/table-inheritance-in-sql-server


Статью по связке с Entity Framework
Implementing Inheritance with the Entity Framework 6 in an ASP.NET MVC 5 Application (11 of 12)
http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application


Inheritance in the Entity Framework
http://blogs.msdn.com/b/adonet/archive/2007/03/15/inheritance-in-the-entity-framework.aspx

EF Designer TPT Inheritance
http://msdn.microsoft.com/en-us/data/jj618293.aspx

EF Designer TPH Inheritance
http://msdn.microsoft.com/en-us/data/jj618292.aspx

среда, 21 мая 2014 г.

Инструкции по обновлению, вставке или удалению из хранилища затронули непредвиденное число строк ({0})

Окружение

Visual Studio 2012
EF 5
MS SQL Server 2008

При добавлении записи в таблицу возникает ошибка

Инструкции по обновлению, вставке или удалению из хранилища затронули непредвиденное число строк ({0}). Сущности могли быть изменены или удалены с момента их загрузки. Обновите записи диспетчера ObjectStateManager

Как искал

В русскоязычном сообществе почти ничего не нашел

нашел занятный сайт - переводчик ошибок
http://finderr.net/clr/ru/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE-%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8E-%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B5-%D0%B8%D0%BB%D0%B8-%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%B8%D1%8E-%D0%B8%D0%B7-%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B0-%D0%B7%D0%B0%D1%82%D1%80%D0%BE%D0%BD%D1%83%D0%BB%D0%B8-%D0%BD%D0%B5%D0%BF%D1%80%D0%B5%D0%B4%D0%B2%D0%B8%D0%B4%D0%B5-/17429932

Далее искал уже по ошибке

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.

Свел возможные варианты решения

1. Вы не указываете значение первичного ключа при записи.
Проверьте. если дейстительно первичный ключ нулл - задайте его явно (часто ребята забывают возвращать его из формы, или при database сценарии указывают это поле как пропускаемое)

если у вас этот вариант - смотрите ссылки
http://rpelepei.blogspot.com/2010/05/0.html
или
http://stackoverflow.com/questions/1836173/entity-framework-store-update-insert-or-delete-statement-affected-an-unexpec

2. Ошибки многопользовательской работы
http://stackoverflow.com/questions/1836173/entity-framework-store-update-insert-or-delete-statement-affected-an-unexpec

3. Побочные эффекты триггеров

http://stackoverflow.com/questions/6819813/solution-for-store-update-insert-or-delete-statement-affected-an-unexpected-n

http://stackoverflow.com/questions/5820992/error-when-inserting-into-table-having-instead-of-trigger-from-entity-data-frame

http://www.britishdeveloper.co.uk/2010/06/entity-framework-optimisticconcurrencye.html

У меня был третий вариант. опишу поподробнее:
Сразу оговорюсь, что игра с SET NOCOUNT ON/OFF мне не помогла.
Также не помог фиктивный  селект в конце триггера.

Таблица заказов ORDER
на ней висит триггер на Insert.
Триггер в свою очередь вызывал хранимую процедуру (синхронизация с таблицей пользователей) в которой делалась выборка из заказа (ORDER) которая не возвращала записей.
Оказалось этот селект и мешал Entity Framework'у нормально работать.

Что сделал: я переделал логику так чтобы не было пустых селектов из исходной таблицы



вторник, 3 декабря 2013 г.

EF6 тесты ошибка

Ситуация

Делаю тесты в Visual Studio 2012 для EF проекта.
Получаю ошибку.

Class Initialization method EFProviders.Problem.UnitTest.TestInitialize threw exception. System.InvalidOperationException: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information..


Решение
помогло добавление строки

var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;

в метод инициализации теста

См. также
Другие проблемы с тестированием связанные с Visual Studio 2012 см. здесь
http://dev-doc.blogspot.com/2013/10/visual-studio-2012-create-unit-tests.html

Ссылки по теме
решение нашел здесь
http://entityframework.codeplex.com/workitem/1590


четверг, 21 ноября 2013 г.

Entity Framework: Как динамически сменить базу данных

Помогло решение из статьи
http://stackoverflow.com/questions/16752371/selecting-database-dynamically-in-entity-framework


похожие статьи
http://stackoverflow.com/questions/18532901/c-sharp-entity-framework-ef-4-1-change-schema-and-database-name-at-runtime

http://stackoverflow.com/questions/518535/how-to-use-ado-net-entity-framework-with-an-existing-sqlconnection

http://stackoverflow.com/questions/18841164/change-database-during-runtime-in-entity-framework-without-changing-the-connect