В веб-приложении на ASP.NET WebAPI используется база данных MS SQL, генерируемая с использованием Entity Framework 6 Code First. Collation этой базы данных - unicode. Однако, если создавать записи в этой БД с кириллическими символами, используя методы WebAPI-контроллера, русский текст заменяется на вопросительные знаки.

База содержит таблицу Articles:

{ text: ntext, summary: nvarchar }

В приложении есть ASP.NET WebAPI-контроллер для работы с этой сущностью с автосгенерированными CRUD-операциями.

Записи пытался создавать различными способами:

  1. Создаю запись запросом в SQL Server Management Studio:

    ​insert into Articles values (1, ‘текст’, ‘еще много текста’)

В БД колонки text и summary отображаются вопросительными знаками

  1. Создаю запись запросом:

    ​insert into Articles values (1, N'текст’, N'еще много текста’)

В БД колонки text и summary отображаются нормально

  1. Создаю запись ajax-запросом из браузера:

    $.post(“api/articles”, { summary: “текст”, text: “еще много текста” }).always(function(res) { console.log(res) });​

В консоли отображается нормальное значение, но если посмотреть в БД или выполнить GET-запрос к этой записи - вернутся вопросительные знаки как в случае 1. Данные отправляются в Unicode.

Для решения этой задачи необходимо в методе OnModelCreating DbContext-а добавить явное указание, что в колонке хранится Unicode-значение:

modelBuilder
.Entity<article>() // Выбираем сущность...
.Property(c=> c.Text) // ... и свойство, которое будем настраивать
.HasColumnType("NTEXT") // Означим тип поля
.IsUnicode(true); // Укажем еще раз, что поле - Unicode.

PS: Если есть возможность, то не используйте тип данных ntext, text и image. В ближайшем версии MS SQL Server эти типы данных будут удалены.