Fluent API, EF 4.1: проблема наследования и внешнего ключа

Есть несколько простых классов:

Первый класс:

public class User
{
   public int UserId { get; set; }
   public string Username { get; set; }

   // ...

   public ICollection<Topic> Topics { get; set; }
}

Второй класс:

public class Publication 
{
   public int PublicationId { get; set; }
   public string Title { get; set; }

   / ...

   public User Author { get; set; }
}

Третий класс:

public class Topic: Publication 
{
   public string TopicContent { get; set; }

   // ...
}

После создания базы данных для моей модели у меня есть следующая структура базы данных:

Пользователи

ID пользователя

Имя пользователя

Публикации

Идентификатор публикации

Заголовок

ТемаКонтент

Author_UserId

User_UserId

Как видите, я получаю два поля Author_UserId и User_UserId с одинаковой ролью в таблице Publications.

Как я могу объединить эти поля в одно поле, используя Fluent API или аннотацию данных?


person Jean Louis    schedule 15.04.2011    source источник


Ответы (1)


Я не думаю, что возможно иметь один и тот же столбец внешнего ключа в таблице Publications. Publication.Author и User.Topics не могут быть конечными точками одной и той же ассоциации. У вас может быть экземпляр Publication, который не является Topic, и ссылка на User:

User user = new User() { Topics = new List<Topic>() };
Publication publication = new Publication();

publication.Author = user;

user.Topics.Add(???);

В ??? вы не можете добавить publication, потому что это не экземпляр Topic. user.Topics должен ссылаться на другой объект, кроме publication, что означает, что эти конечные точки не могут принадлежать к одной и той же ассоциации.

Изменить

Если вам нужна только одна ассоциация только с одним столбцом внешнего ключа в базе данных, вы должны либо переместить свойство Author из Publication в Topic, либо позволить коллекции в вашем классе User ссылаться на Publication вместо Topic:

public ICollection<Publication> Publications { get; set; }
person Slauma    schedule 15.04.2011
comment
Спасибо за подробный ответ. - person Jean Louis; 15.04.2011