3

Я новичок в платформе Entity Framework и ORM для этого mather. В проекте, в котором я включен, у нас есть устаревшая база данных, со всеми ее ключами как строки, без учета регистра.Entity Framework и ассоциации между строковыми ключами

Мы конвертируем в MSSQL и хотим использовать EF как ORM, , но у вас есть проблема.

Вот пример, который иллюстрирует нашу проблему:

TableA имеет первичный ключ строки, TableB имеет ссылку на этот первичный ключ.

В LINQ мы пишем что-то вроде:


var result = from t in context.TableB select t.TableA; 
foreach(var r in result) 
    Console.WriteLine(r.someFieldInTableA); 

если TableA содержит первичный ключ, который читает «А», и TableB содержит две строки, ссылающихся TABLEA, но с разными случаями в области referenceing, «а» и "А".

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

Используя SQL Profiler, я заметил, что выбраны обе строки.

Есть ли способ сказать Entity Framework, что ключи нечувствительны к регистру?

Редактировать:
Теперь мы протестировали это с помощью NHibernate и пришли к заключению, что NHibernate работает с ключами без учета регистра. Поэтому NHibernate может быть лучшим выбором для нас.
Тем не менее, мне все же интересно узнать, есть ли способ изменить поведение Entity Framework.


Спасибо за ваш ответ!

Проблема заключается в том, что если мы добавим это ограничение в базу данных, то устаревшее приложение может перестать работать из-за его построения. Лучшим для нас было бы, если возможно, изменение поведения EF. Я предполагаю, что это невозможно, но я даю ему шанс.


С уважением,
Фредриком

редактировать: Причины, почему я добавил ответ на свой вопрос, что я добавил этот вопрос, прежде чем я был зарегистрированным пользователем, и когда я была зарегестрирована мой счет Я не могу добавлять комментарии или редактировать свой пост. Теперь учетные записи объединяются.

ответ

4

Я думаю, вам нужно внести изменения в схему на SQL Server, а не в EF. Ответ этой записи о том, как сделать столбец чувствительным к регистру, выглядит следующим образом: T-SQL: How do I create a unique key that is case sensitive?

+0

Что произойдет, если поля, которые вы пытаетесь создать связь, не являются сущностными ключами? Можно ли это сделать с помощью EF? Вам нужно отредактировать схему там? –

2

Я знаю, что это не идеальное решение, но в LINQ почему бы не присоединиться к себе. EF не работает, потому что файл .Designer.cs возвращает objA.Equals (objB) при выполнении соединения. .Equals чувствителен к регистру.

var result = from t1 in context.TableB join t2 в контексте. TableA на t1.someFieldInTableB.ToUpper() равно t2.someFieldInTableA.ToUpper();

Hackish Я знаю, но LINQ to Entities все еще находится в зачаточном состоянии, а классы объектов, которые были разработаны, разработаны по определенным причинам, которые не обрабатывают исключительные случаи в дизайне, таком как это.

Другой альтернативой является создание собственного генератора кода с использованием шаблонов T4. Поскольку все является общедоступным частичным классом, вы можете создать навигационное свойство, которое фактически делает нечувствительный к регистру сравнительный анализ, который вы ищете.

Чтобы ответить на ваш вопрос правдиво, однако, нет способа «из коробки», чтобы получить EF для навигации, используя регистр, нечувствительный к регистру.

-1

В качестве альтернативы Entity Framework вы можете использовать LINQ to SQL, который хорошо работает с отношениями, связанными с регистрами, чувствительными к регистру. Хотя эта ORM не предлагает всю гибкость EF или NHibernate, во многих случаях ее может быть достаточно.

Я недавно опубликовал нить на официальном Microsoft Entity Framework форум: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d4aa6880-31b3-4ff2-b7f5-e2694d76772e

+0

Он спрашивает об объектной структуре, а не об альтернативах! –

0

Я знаю, что это не идеальное решение, но в LINQ почему бы не сделать себе присоединиться. EF не работает, потому что файл .Designer.cs возвращает objA.Equals (objB) при выполнении >> join. .Equals чувствителен к регистру.

Ну, если вы не переопределить метод Equals

сгенерированные классы домена в EF неравнодушны нет? Так что это довольно легко заменить по умолчанию Равно реализации этих классов с помощью собственных реализаций (что, конечно, сделали бы его нечувствительно к регистру)

КСТАТИ: техник Даты восходят от .NET 1.0

Со всем этим. NET 3.5/4.0, Linq и Lambda, люди склонны забывать об основах

0

Я придумал обходное решение, которое «строит» ассоциацию, основанную на строках, в памяти после того, как контекст извлек строки из базы данных (подсказка : использование контекста. [EntityTypeCollection]. Местный объект. Вы можете увидеть мой ответ на https://stackoverflow.com/a/12557796/62278

Смежные вопросы