Entity Framework 4.0 Многие-многие отношения с использованием не первичного ключа - PullRequest
1 голос
/ 07 апреля 2011

Я пытаюсь создать общий репозиторий, используя Entity Framework 4.0, используя устаревшую базу данных MS SQL, которую я унаследовал.Довольно знакомый сценарий.

Мне нужно добавить информацию о категории в довольно длинный список существующих элементов.

Элементы могут одновременно принадлежать нескольким категориям, поэтому я создал таблицу сопоставления с именем CategoryMapping

Database Diagram

К сожалению SchemaDefinitionCode не является уникальным и не может быть преобразован в внешний ключ (FK) в базе данных.

Я попытался добавить свой частичный класс в сущность DefinitionSchema, но, поскольку он не проиндексирован, это серьезно ухудшает производительность. Демонстрационный код для тестирования, я не хочу создавать новый контекст каждый раз, когда загружаю этот :

public partial class DefinitionSchema
{
    private MyEntities context;

    public IQueryable<Category> Categories
    {
        get
        {
            context = new MyEntities();

            var categories = context.Categories
                                             .Where(c => c.CategoryMappings
                                                .Where(m => m.SchemaDefinitionCode == this.SchemaDefinitionCode).Any());

            return categories;
        }
    }
}

Затем я могу вызвать список элементов, таких как:

var q = context.SchemaDefinitions
.Where(s => s.Categories
    .Where(c => c.Name == category)
    .Any()
 );

Как наиболее эффективно связать мои таблицы и сопоставления, не стирая существующую структуру базы данных?

1 Ответ

0 голосов
/ 07 апреля 2011

Это не может работать таким образом, потому что EF не поддерживает уникальные ключи, и SchemaDefinitionCode должен быть уникальным, чтобы сформировать действительное отношение «многие ко многим» с Category.Если ваш SchemaDefinitionCode не уникален в таблице DefinitionSchema, он не может быть использован в качестве основного конца в отношении с CatagoryMapping.Если он уникален, вы можете использовать SchemaDefinitionID, потому что не более одного идентификатора будет иметь одинаковое значение кода.

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