Code First CTP: несколько PK или FK

В некоторых случаях у нас могут быть дублированные ссылки PK/FK, поэтому объект A и объект B находятся в отношениях PK/FK, но 3 раза. Таким образом, объект A будет иметь 3 коллекции FK, а объект B будет иметь 3 ссылки на объекты. Как это работает с шаблоном code-first? Следуете ли вы соглашению об именах первых подходов модели/базы данных Entity Framework (EntityA, EntityA1 и т. д.), и он знает, как подключить эти отношения, или есть дополнительный шаг, или что?

Спасибо.


person Brian Mains    schedule 12.10.2010    source источник


Ответы (1)


Если бы вы должны были определить свои классы, как это

public class EntityA
{
    public int EntityAId { get; set; }
    public virtual EntityB EntityB1 { get; set; }
    public virtual EntityB EntityB2 { get; set; }
    public virtual EntityB EntityB3 { get; set; }
}

public class EntityB
{
    public int EntityBId { get; set; }
    public string Name { get; set; }
}

EF Code First создаст две таблицы (EntityAs, EntityBs). При конвекции таблица EntityAs будет иметь первичный ключ EntityAId и три внешних ключа, связанных с вызываемой EntityB (EntityB1_EntityBId, EntityB2_EntityBId, EntityB3_EntityBId).

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

Например:

public class EntityA
{
    public int EntityAId { get; set; }
    public int MySpecialFkName { get; set; }
    [RelatedTo(ForeignKey = "MySpecialFkName")]
    public EntityB EntityB1 { get; set; }
}

Если вам не нужны метаданные RelatedTo в вашем классе POCO, вы можете вместо этого определить отношение в методе OnModelCreating.

modelBuilder.Entity<EntityA>().HasRequired(p => p.EntityB1)
            .HasConstraint((fk, pk) => fk.MySpecialFkName == pk.EntityBId);
person ckal    schedule 13.10.2010