EF4.1 (сначала код) - Как указать составные отношения - PullRequest
3 голосов
/ 11 июля 2011

В Linq to SQL я мог бы указать отношение, которое не должно зависеть от внешних ключей и пакетов, существующих в базе данных, что полезно для создания составных отношений, таких как:sql похож на " .. join EquipmentPorts EP on EP.EquipmentId = blah and EP.PortNumber = Blah".

Могу ли я сделать то же самое в EF4.1 (используя аннотации или свободный API)?Я знаю, что вы можете указать составные ключи и использовать атрибуты [Keys] и [ForeignKeys], но это отношение не сопоставляется с ключами ...

Ответы [ 2 ]

0 голосов
/ 12 июля 2011

Используйте HasKey http://www.ienablemuch.com/2011/06/mapping-class-to-database-view-with.html

Либо используйте HasKey, поместите это в OnModelCreating

 modelBuilder.Entity<SalesOnEachCountry>().HasKey(x => new { x.CountryId, x.OrYear });   

Или используйте ключевой порядок столбцов

public class SalesOnEachCountry
{        
    [Key, Column(Order=0)] public int CountryId { get; set; }
    public string CountryName { get; set; }
    [Key, Column(Order=1)] public int OrYear { get; set; }
     
    public long SalesCount { get; set; }      
    public decimal TotalSales { get; set; }
}

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

Это может быть ответ составной ключ в качестве внешнего ключа

Этот ответ подтверждает мое предположение, что вы можете поместить два атрибута ForeignKey в сам дочерний класс.

0 голосов
/ 12 июля 2011

Как работает пример отношения из вашего кода?Я ожидаю, что EquipementId должен быть либо PK, либо уникальным ключом (не поддерживается как в L2S, так и в EF) с одной стороны, потому что в противном случае отношение не может существовать (как один-к-одному, так и один-ко-многим требуется уникальный принципал)Если с одной стороны это PK, номер порта является избыточным.

Код сначала разрешает только сопоставление с ключами.Если у вас есть существующая база данных, вы можете обмануть ее в своей модели и отобразить новые отношения таким же образом, как вы бы отобразили существующую, но вы все равно должны следовать простому правилу - свойства в основном являются первичными ключами, свойства в зависимом объекте отображаются как внешние ключи.

Если вы хотите, чтобы EF генерировал для вас БД, у вас всегда будут все связи в базе данных.

...