EF4 может генерировать модель из БД с использованием пользовательских соглашений - PullRequest
3 голосов
/ 10 декабря 2011

Есть ли способ в EF4.1 генерировать классы сущностей, которые следуют пользовательским соглашениям об именах вместо точного совпадения имен столбцов БД?

Мы начинаем использовать EF4.1 для существующего проекта. Мы хотели бы следовать нашим существующим соглашениям о случаях верблюдов для имен свойств в наших объектах, которые не соответствуют нашим столбцам БД.

Сначала, используя DB, у меня есть столбцы, похожие на [first_name] и [last_name], и я хотел бы создать свойства модели в моем EDMX, такие как FirstName и LastName.

Обновление: я не хочу обновлять вручную все имена!

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011

Смысл сопоставления заключается в том, чтобы вручную определять новые имена. Если у вас есть соглашение, которое всегда можно вывести из имени столбца, вы можете создать собственный инструмент / скрипт / преобразование, которое автоматически изменит ваш файл EDMX (это всего лишь файл XML, и вам нужно изменить его часть CSDL и часть MSL).

1 голос
/ 13 декабря 2011

За другой ответ здесь я создал собственный инструмент и поместил исходный код на GitHub: EdmxUpdater (отказ от ответственности, пользовательский интерфейс ужасен).

По сути, я взял все XSD и сгенерировал типы сериализации XML, а затем написал некоторый код, чтобы фактически выполнить обновления имени. Проект очень грубый, но в основном обрабатывает оболочку Паскаля и удаляет подчеркивания из свойств.

Он использует сопоставление, поэтому изменения имени являются идемпотентными.

    protected override void UpdateEdmx(TEdmx edmx)
    {
        var scalarProperties = from esm in edmx.Runtime.Mappings.Mapping.EntityContainerMapping.EntitySetMapping
                               from etm in esm.EntityTypeMapping
                               from f in etm.MappingFragment
                               from sp in f.ScalarProperty
                               select new { ScalarProperty = sp, etm.TypeName };

        var mapQuery = from sp in scalarProperties
                       let item = new { sp.TypeName, sp.ScalarProperty.Name, sp.ScalarProperty.ColumnName }
                       group item by sp.TypeName into g
                       select g;

        //build map of new entity property names
        var map = mapQuery.ToDictionary(g => g.Key, g => g.Distinct().ToDictionary(sp => sp.Name, sp => UpdateName(sp.ColumnName)));

        //update map property names:
        foreach (var sp in scalarProperties)
        {
            sp.ScalarProperty.Name = map[sp.TypeName][sp.ScalarProperty.Name];
        }

        //conceptual entities
        foreach(var entity in edmx.Runtime.ConceptualModels.Schema.EntityType)
        {
            var typeName = String.Format("{0}.{1}", edmx.Runtime.ConceptualModels.Schema.Namespace, entity.Name);
            var typeMap = map[typeName];

            //keys
            foreach (var keyRef in entity.Key.PropertyRef)
            {
                keyRef.Name = typeMap[keyRef.Name];
            }

            //conceptual properties
            foreach (var property in entity.Property)
            {
                property.Name = typeMap[property.Name];
            }
        }

        var principalPropertyQuery = from association in edmx.Runtime.ConceptualModels.Schema.Association
                                     let end = association.End.Where(e => e.Role == association.ReferentialConstraint.Principal.Role).Single()
                                     from property in association.ReferentialConstraint.Principal.PropertyRef
                                     select new { TypeName = end.Type, Property = property };

        var dependentPropertyQuery = from association in edmx.Runtime.ConceptualModels.Schema.Association
                                     let end = association.End.Where(e => e.Role == association.ReferentialConstraint.Dependent.Role).Single()
                                     from property in association.ReferentialConstraint.Dependent.PropertyRef
                                     select new { TypeName = end.Type, Property = property };

        foreach (var property in principalPropertyQuery.Union(dependentPropertyQuery))
        {
            property.Property.Name = map[property.TypeName][property.Property.Name];
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...