Конфигурация порядка типов для иерархии классов - PullRequest
0 голосов
/ 25 октября 2019

Короче говоря:

Учитывая модель 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);
    });

Любой надежный источник в заказе конфигурации типа приветствуется, другие подходы для надежного решения проблемы, не зная, что заказ конфигурации также подойдет.

...