EF4.1 (сначала код) — как указать составную связь

В Linq to SQL я мог указать отношение, которое не должно было зависеть от внешних ключей и pks, существующих в базе данных, что полезно для создания составных отношений, подобных этому:

public class Equipment_CableNormalised
{
    ...

    [Association(ThisKey = "EquipmentId,PortNumber", OtherKey = "EquipmentId,PortNumber", IsForeignKey = false)]
    public List<EquipmentPort> EquipmentPorts
    {
        get; set;
    }

}

Затем это сгенерировало sql, похожий на " .. join EquipmentPorts EP on EP.EquipmentId = blah and EP.PortNumber = Blah".

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


person Matt Roberts    schedule 11.07.2011    source источник
comment
Что вы подразумеваете под отношением, которое не отображается на ключи? Если он не соответствует ключам (PK/UK, FK), это не отношение к базе данных.   -  person Ladislav Mrnka    schedule 11.07.2011
comment
Это не отношение базы данных. Так получилось, что одна из этих сущностей фактически отображается на представление, а не на таблицу. В L2S было удобным решением связать эти объекты вместе с этим определением ассоциации, что избавило меня от необходимости писать более сложный код запросов. Так что это не чистое представление того, что находится в базе данных.   -  person Matt Roberts    schedule 11.07.2011


Ответы (2)


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

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

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

person Ladislav Mrnka    schedule 11.07.2011
comment
Спасибо за ответ. В этом случае я никогда не захочу создавать БД из EF, она довольно сложная и содержит хранящиеся процедуры и некоторые типы данных, не поддерживаемые EF. В L2S вы можете создавать отношения (ассоциации), как в моем примере, которые на самом деле не сопоставляются с отношениями, существующими в базе данных. С одной стороны этого примера находится представление (поэтому нет ключей), а с другой стороны — таблица с собственным идентификатором PK. Я вижу это как L2S, позволяющий мне просто определять специальные отношения, точно так же, как вы можете СОЕДИНИТЬ две таблицы в SQL, которые на самом деле не имеют определенных отношений. - person Matt Roberts; 12.07.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 в сам дочерний класс.

person Michael Buen    schedule 11.07.2011
comment
Спасибо, пока не было никакой радости от этого, я попробую более простой тест и посмотрю, как я справлюсь. - person Matt Roberts; 12.07.2011