Имеется проект EF6 (code-First). В сущности File имеется свойство FullPath, содержащее полный путь к файлу в верхнем регистре.
Проблема в том, что при поиске файла содержащего в своем пути символ ß он прозрачно меняется на ss, другими словами возвращается не то что ищем:
SELECT FullPath
FROM File
WHERE FullPath = '\\SERVER\SHARE\FOLDER\STOß.TXT'
-- returns: '\\SERVER\SHARE\FOLDER\STOSS.TXT'
Поэтому, при наличии путей отличающихся написанием ß и 'ss' происходят ошибки.
Можно ли каким-либо образом установить COLLATE для определенного столбца? Каким образом решается эта проблема?
Из коробки EF не поддерживает COLLATION.
Если вы хотите указать -- тогда в поправьте метод Up() миграции, создающей столбец SQL-запрос с ALTER COLUMN, как-то так:
public partial class DisplayNameInUser : DbMigration
{
public override void Up()
{
this.AddColumn("dbo.AspNetUsers", "DisplayName", c => c.String(nullable: false, maxLength: 70));
this.Sql("ALTER TABLE dbo.AspNetUsers ALTER COLUMN DisplayName nvarchar(70) COLLATE Latin1_General_CS_AS");
this.Sql("UPDATE dbo.AspNetUsers SET DisplayName = UserName");
this.CreateIndex("dbo.AspNetUsers", "DisplayName", unique: true, name: "DisplayNameIndex");
}
public override void Down()
{
this.DropIndex("dbo.AspNetUsers", "DisplayNameIndex");
this.DropColumn("dbo.AspNetUsers", "DisplayName");
}
}
Насчёт того, какую кодировку ставить мммм.... я бы рекомендовал поэкспериментировать самостоятельно, в помощь могу посоветовать этот топик на EnSO: http://stackoverflow.com/questions/42871959
Возможно, вам подойдёт SQL_Latin1_General_CP437_BIN2, проверил только что на SQL 11:
INSERT INTO [dbo].[AspNetUsers]
([Id] , [Email],[EmailConfirmed],[PasswordHash],[SecurityStamp],[PhoneNumber],[PhoneNumberConfirmed],[TwoFactorEnabled],[LockoutEndDateUtc],[LockoutEnabled],[AccessFailedCount],[UserName],[DisplayName])
VALUES
('1', 'mail1@gmail.com', 0, '123','123',null, 0, 0, 1, 1, 0, 'Masse', 'Masse')
INSERT INTO [dbo].[AspNetUsers]
([Id] , [Email],[EmailConfirmed],[PasswordHash],[SecurityStamp],[PhoneNumber],[PhoneNumberConfirmed],[TwoFactorEnabled],[LockoutEndDateUtc],[LockoutEnabled],[AccessFailedCount],[UserName],[DisplayName])
VALUES
('2', 'mail2@gmail.com', 0, '123','123',null, 0, 0, 1, 1, 0, 'Maße', 'Maße')
SELECT TOP 10
*
FROM [dbo].[AspNetUsers]
WHERE 1 = 1
-- AND DisplayName like '%ss%'
AND DisplayName like '%ß%'
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости