Короче говоря:
Учитывая модель EF с иерархией классов, есть ли гарантия того, что действия по конфигурированию типа родительского класса выполняются до действий по конфигурированию дочернего класса?
Справочная информация:
Я хочу добавить комментарии из моей модели кода в соответствующие таблицы и столбцы в базе данных.
У меня есть пользовательский Convention
, который добавляет комментарии кода в качестве аннотаций. (ConventionTypeConfiguration.HasTableAnnotation
, ConventionPrimitivePropertyConfiguration.HasColumnAnnotation
). На более поздних этапах аннотации преобразуются в операторы создания комментариев SQL.
Проблема заключается в том, что в случае таблицы на иерархию комментарии класса из родительского и подкласса ссылаются на одну и ту же таблицу БД и поэтомукак только обе таблицы комментируются разными текстами, возникает исключение, жалуясь на то, что аннотация для одного и того же объекта не может быть зарегистрирована с несколькими разными значениями.
Мой текущий подход заключается в кэшировании комментариев типа и дляДля каждого типа проверьте, есть ли в кеше комментарий типа предка, прежде чем применять текущий комментарий типа. Этот подход работал, когда я тестировал его, но он был бы надежным только при условии, что родительский тип всегда настраивается перед дочерним типом.
Соответствующий код в конструкторе Convention
:
var tableComment = new ConcurrentDictionary<Type, string>();
Types()
.Having(t => GetTypeCommentNode(t))
.Configure((c, node) =>
{
var hierarchyType = c.ClrType;
string baseComment = null;
// Check for already registered base type comments and only use the current type comment if no base comment exists
// This should ensure that only one comment value is registered per table object
while (hierarchyType != null && !tableComment.TryGetValue(hierarchyType, out baseComment))
{
hierarchyType = hierarchyType.BaseType;
}
var comment = baseComment ?? GetCommentTextWithNewlineReplacement(node);
tableComment[c.ClrType] = comment;
c.HasTableAnnotation(CommentAnnotationKey, comment);
});
Любой надежный источник в заказе конфигурации типа приветствуется, другие подходы для надежного решения проблемы, не зная, что заказ конфигурации также подойдет.