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.