Связанные без ключа ассоциации с Entity Framework - PullRequest
2 голосов
/ 21 апреля 2011

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

например. У меня есть две таблицы (это надуманный пример, но достаточно представить мою реальную базу данных, которую я не могу изменить)

------Items------    ---Orders----
-----------------    -------------
* ItemId        -    * OrderId   -
* EffectiveDate -    - OrderDate -
- Name          -    - ItemId    -
-----------------    -------------    * denotes primary key field

В идеале я хотел бы, чтобы в Order было свойство, указывающее на элемент, действующий на OrderDate, но я мог бы жить с ассоциацией на Order с коллекцией Items, а затем создать свойство только для чтения в Order, которое выбрало правильный Item.

РЕДАКТИРОВАТЬ: база данных и модель будут только для чтения, поэтому решения только для чтения в порядке.

Возможно ли это в рамках сущности? (или даже LINQ to SQL?)

Я считаю, что это возможно с помощью NHibernate (кто-нибудь может подтвердить?), Но я продолжаю бить кирпичные стены структурой сущностей. Пока единственное решение, которое мне удалось решить, - это создать свойство в частичном классе для Order, которое использует « hack » для доступа к ObjectContext из заказа и запроса контекста. Коллекция элементов непосредственно как таковая

private IEnumerable<Item> Items
{
    get 
    { 
        var ctx = this.GetContext();
        return from i in ctx.Items where i.ItemId == this.ItemId select i; 
    }
}

public Item Item
{
    get 
    { 
        return (from i in Items 
               where i.EffectiveDate <= this.OrderDate
               orderby i.EffectiveDate ascending
               select i).First(); 
    }
}

Есть ли лучшее решение?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Проблема в том, что ваша база данных спроектирована неправильно, и между этими таблицами нет никакой связи - Order не может иметь отношение FK к Item, потому что его FK не содержит всех частей PK Предмета. В базе данных этого можно избежать, поместив уникальный индекс в ItemId в таблице Item, но это делает ваш составной PK избыточным и не решает проблему для EF, потому что EF не поддерживает уникальные ключи. Отношение «многие ко многим» также нельзя отобразить, поскольку отсутствует таблица соединений.

Так что ответ для EF - нет. Тот же ответ будет для linq-to-sql.

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

Вместо «взлома» для получения контекста, вы можете использовать метод и взять контекст в качестве параметра, или просто создать новый контекст (по крайней мере, в LINQ to SQL, это минимальное наказание за это в зависимости от вашегосценарий использования и если мое исследование является действительным).

Однако вы пытаетесь создать условную ссылку, поэтому вам придется написать метод, представляющий это условие - фреймворки делают в основном то же самое (т. Е. Выбирают Item с идентификатором вКолонка ФК).Я не совсем уверен, в чем проблема при этом?

Я также полностью сбит с толку вашим ERD - кажется, что:

  • Элементы имеют одинаковый идентификатор, норазные имена с течением времени (в данном случае я бы не назвал таблицу «Предмет»)
  • Каждый заказ на один предмет
  • Вы пытаетесь понять, как назывался предметна момент заказа.

Из любопытства, верно ли это?

Исходя из того, что вы не можете изменить ERD, возможно, вы упомянули метод, который вы упомянулилучший способ достичь этого (хотя вы можете пометить Items как IQueryable<Item>).

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