Entity Framework и ассоциации между строковыми ключами - PullRequest
3 голосов
/ 06 апреля 2009

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

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

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

Таблица A имеет ключ первичной строки, Таблица B имеет ссылку на этот первичный ключ.

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


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

, если TableA содержит первичный ключ, который читает «A», а TableB содержит две строки, которые ссылаются на TableA, но с разными регистрами в поле ссылки, «a» и «A».

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

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

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

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


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

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


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

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

Ответы [ 5 ]

4 голосов
/ 06 апреля 2009

Я думаю, вам нужно внести изменения в схему в SQL Server, а не в EF. Ответ этого поста о том, как сделать столбец чувствительным к регистру, выглядит так, как будто он сработает: T-SQL: Как создать уникальный ключ с учетом регистра?

2 голосов
/ 19 апреля 2009

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

var result = от t1 в context.TableB присоединить t2 в context.TableA к t1.someFieldInTableB.ToUpper () равно t2.someFieldInTableA.ToUpper ();

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

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

Хотя, чтобы ответить на ваш вопрос правдиво, не существует "готового" способа заставить EF выполнять навигацию, используя поиск без учета регистра.

0 голосов
/ 24 сентября 2012

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

0 голосов
/ 26 января 2012

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

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

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

Кстати: технический прием восходит к .NET 1.0

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

0 голосов
/ 10 апреля 2010

В качестве альтернативы 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...