Использование Entity Framework с отношением «один ко многим», определенным с двумя внешними ключами

Я работаю с существующей базой данных, поэтому изменение схемы невозможно. Вот таблицы, с которыми я работаю...

Product
-------------------------------------
ID               - GUID         [PK]
Name             - varchar(100) 
ModelId          - GUID         [FK1, FK2]
SoftWareVersion  - varchar(10)  [FK2]

[FK1] Foreign Key to Model table
[FK2] Foreign Composite key to SoftwareVersion table


ProductModel
-------------------------------------
ID               - GUID         [PK]
ModelName        - varchar(100)


SoftwareVersion
-------------------------------------
ID               - GUID         [PK]
Version          - varchar(10)
ModelId          - GUID         [FK1]

[FK1] Foreign Key to Model table

На каждом отдельном продукте установлено программное обеспечение. У нас есть несколько моделей продуктов, и каждый продукт, очевидно, связан с одной моделью (Product [FK1]).

В течение срока службы каждой модели продукта может быть выпущено несколько обновлений/версий программного обеспечения. Аналогичным образом Программное обеспечение может быть установлено на многие Модели.

Мне нужно иметь возможность получить ProductID и вернуть версию программного обеспечения, установленную на этом конкретном продукте. Обычно я получаю версию программного обеспечения, связанную с моделью продукта, который я ищу, но модель может иметь несколько обновлений. Я не могу выполнить поиск только по полю Product.SoftwareVersion, так как это вернет ВСЕ различные модели, на которых было установлено это программное обеспечение.

Итак, в конечном итоге мне нужно вернуть запись из SoftwareVersion, где ModelId и версия совпадают с данными для продукта, который я ищу.

Я хотел бы вернуть SoftwareVersion как свойство продукта...

Product.SoftwareVersion

В моем определении ProductEntity у меня есть следующее...

[Table("Product")]
public class ProductEntity
{
    [ForeignKey("Model")]
    public Guid ModelID { get; set; }
    public virtual ProductModelEntity Model { get; set; }


    [ForeignKey("SoftwareVersion")]
    public String SoftwareVersionNumber { get; set; }
    public virtual SoftwareVersionEntity SoftwareVersion { get; set; }
}

Таким образом, «ModelID» выполняет роль внешнего ключа для модели и как часть составного внешнего ключа для версии программного обеспечения. Однако я не могу назначить несколько атрибутов ForeignKey одному и тому же свойству...

[ForeignKey("Model"),ForeignKey("SoftwareVersion")]
public Guid ModelID { get; set; }
public virtual ProductModelEntity Model { get; set; }

Я предпочитаю работать с атрибутами, если это возможно, но я также открыт для других методов. (Атрибуты описывают класс непосредственно в соответствующем коде, а не распространяют определение по библиотеке. Приятно понимать, на что вы смотрите, вместо того, чтобы тратить время на поиск определений... но я отвлекся!)

Любая помощь, как всегда, приветствуется.

Спасибо

-G


person Gary O. Stenstrom    schedule 12.07.2012    source источник


Ответы (1)


Я думаю, что следующие аннотации будут работать:

[Table("Product")]
public class ProductEntity
{
    public Guid ModelID { get; set; }
    public String SoftwareVersionNumber { get; set; }

    [ForeignKey("ModelID, SoftwareVersionNumber")]
    public virtual ProductModelEntity Model { get; set; }

    [ForeignKey("SoftwareVersionNumber")]
    public virtual SoftwareVersionEntity SoftwareVersion { get; set; }
}

Or:

[Table("Product")]
public class ProductEntity
{
    [ForeignKey("Model"), Column(Order = 1)]
    public Guid ModelID { get; set; }

    [ForeignKey("Model"), ForeignKey("SoftwareVersion"), Column(Order = 2)]
    public String SoftwareVersionNumber { get; set; }

    public virtual ProductModelEntity Model { get; set; }
    public virtual SoftwareVersionEntity SoftwareVersion { get; set; }
}
person Slauma    schedule 12.07.2012