Entity Framework и дженерики

У меня есть пара независимых объектов, каждый из которых имеет список общих объектов. Например,

public class Project 
{ 
   public IEnumerable<CommentEntry<Project>> Comments{get;set;}
}
public class Sample
{ 
   public IEnumerable<CommentEntry<Sample>> Comments{get;set;}
}
public class CommentEntry<T> where T: class
{ 
   public int TId {get;set;}
   public int CommentEntryId{get;set;}
   public DateTime TimeStamp{get;set;}
   public string Comment{get;set;}
}

Используя свободный API Entity Framework 5, я бы хотел таблицу CommentEntry для проектов и запросов. Итак, вот мой код сопоставления:

modelBuilder.Entity<CommentEntry<Project>>()
            .Map(m =>
                {
                    m.ToTable("EngineeringProjectComments");
                });
        modelBuilder.Entity<CommentEntry<Request>>()
            .Map(m =>
            {
                m.ToTable("SampleRequestComments");
            });

Когда я пытаюсь выполнить миграцию, я вижу следующее сообщение:

Тип CommentEntry`1[Project]'не был сопоставлен. Убедитесь, что тип не был явно исключен с помощью метода Ignore или аннотации данных NotMappedAttribute. Убедитесь, что тип был определен как класс, не является примитивным, вложенным или универсальным и не наследуется от EntityObject.

Я вижу очевидный недостаток моей попытки использовать дженерики в этом контексте. Однако может ли кто-нибудь предложить альтернативу моей структуре таблиц базы данных, коду классов или коду отображения, который позволит мне совместно использовать один общий тип среди многих классов и иметь независимые таблицы?

1 ответ

Решение

Просто используйте нормальную структуру наследования. И вместо использования определенного имени идентификатора, такого как EngineeringProjectId, просто используйте Id.

public class Project 
{ 
   public ICollection<ProjectCommentEntry> Comments{get;set;}
}
public class Sample
{ 
   public ICollection<SampleCommentEntry> Comments{get;set;}
}
public class ProjectCommentEntry : CommentEntry {}
public class SampleCommentEntry : CommentEntry {}
public class CommentEntry
{ 
   public int Id {get;set;}
   public int CommentEntryId{get;set;}
   public DateTime TimeStamp{get;set;}
   public string Comment{get;set;}
}

Кстати, вы не можете использовать IEnumerable для свойств навигации в EF, вам нужна полная коллекция, поэтому вам следует вместо этого использовать ICollection.

Другие вопросы по тегам