Entity Framework table-per-type: 1: 0 * Связь FK с производным классом - это FK базового класса или производного класса?

У меня есть класс Tenant абстрактного типа UserProfile. Я использую метод наследования по типу таблицы. Арендатор может представлять группу арендаторов. A TenantGroupMember - одна из таких групп. Итак, 1 Tenant может иметь ноль или много TenantGroupMember.

Как эта ассоциация представлена ​​с использованием подхода «таблица за типом»? Я подошел к этому следующим образом:

[Table("TenantGroupMember")]
public class TenantGroupMember
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int TenantGroupMemberId { get; set; }

    // 1:many with Tenant - base UserProfile
    public int UserProfileId { get; set; }
}

[Table("Tenant")]
public class Tenant : UserProfile
{
    public string TenantAge { get; set; }
    public string PersonalDescription { get; set; }

    // 1:many with TenantGroupMember
    public virtual ICollection<TenantGroupMember> TenantGroupMembers { get; set; }
}

Правильно ли я сделал FK в TenantGroupMember из UserProfile? Поскольку ICollection TenantGroupMembers находится в Tenant, будет ли EF знать, что TenantGroupMember может быть связан только с Tenant, а не с любыми другими производными классами UserProfile?


person MattSull    schedule 26.01.2013    source источник


Ответы (1)


Да ты прав. Однако вы должны явно объявить свойство TenantGroupMember.UserProfileId как внешний ключ отношения. EF не обнаружит это по соглашению и будет рассматривать его как обычное скалярное свойство и создавать еще один столбец FK в базе данных. Вы можете сделать это с помощью аннотаций к данным ...

[ForeignKey("UserProfileId")]
public virtual ICollection<TenantGroupMember> TenantGroupMembers { get; set; }

... или с помощью Fluent API:

modelBuilder.Entity<Tenant>()
    .HasMany(t => t.TenantGroupMembers)
    .WithRequired()
    .HasForeignKey(tgm => tgm.UserProfileId);

В отношении отношения будет таблица Tenant в базе данных в качестве таблицы основного / первичного ключа, а не таблица UserProfile.

person Slauma    schedule 27.01.2013
comment
Когда я пытаюсь добавить миграцию, я получаю эту ошибку из консоли диспетчера пакетов. Компонент внешнего ключа «UserId» не является объявленным свойством для типа «Tenant». Убедитесь, что оно не было явно исключено из модели и является допустимым примитивным свойством. У клиента нет UserId явным образом, но он наследует его от UserProfile. Я создаю ассоциации с Fluent API, есть идеи? - person MattSull; 28.01.2013
comment
Привет, извините, что разбудил старый вопрос, но я бы предпочел проверить, прежде чем размещать новый вопрос. Я работаю в проекте по внедрению TPT, и мы сталкиваемся с той же проблемой, о которой вы упомянули в своем вопросе. Решил ли ответ Слаурна вашу проблему или вам нужно было сделать что-то еще, чтобы решить эту проблему? - person Mantisen; 05.02.2015