Entity Framework v4 и подчеркивание в именах столбцов - PullRequest
2 голосов
/ 30 марта 2011

Кто-нибудь нашел решение или обходной путь, чтобы решить, как Entity Framework v4 поддерживает имена столбцов с префиксом подчеркивания?Я заметил, что в свойствах сущностей, созданных EFv4, префикс подчеркивания заменен на префикс "C_".Так, например, столбец базы данных:

Order._activity

становится свойством сущности:

Order.C_activity

Затем, когда я пытаюсь выполнить запрос, я получаю сообщение об ошибке:

Считыватель данных несовместим с указанным «CorporateModel.Order».Элемент типа 'C_activity' не имеет соответствующего столбца в считывателе данных с тем же именем.

Это устаревшая база данных с зависимым приложением, поэтому изменение имен столбцов в базе данныхне вариант.

Спасибо за любой вклад.

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

Кажется, что EF не поддерживает имена свойств, которые начинаются с подчеркивания, и что это ограничение шаблона, применяемое схемами EDM. Одним из примеров является схема SSDL .

Я выбрал другое решение: использование LINQ to SQL вместо EF для построения модели, затем использование поставщика отражения для реализации IQueryable / IUpdatable на модели (см. здесь ), чтобы я мог представить его через Служба данных WCF. Это сохраняет подчеркивания в модели и в полученных OData, возвращенных из службы.

Однако есть предостережение: поскольку генераторы прокси-кода клиента Microsoft используют EdmItemCollection для анализа метаданных во время генерации, попытка сгенерировать прокси (например, в Visual Studio) завершается неудачно для службы со свойствами сущностей, начинающимися с подчеркиваний. Вам потребуется использовать OData из такой службы без помощи одного из этих прокси-генераторов.

1 голос
/ 30 марта 2011

ОК, у меня нет точного решения для вас, но у меня похожая ситуация. EF Сгенерированные поля заканчиваются ID, если при ссылке на другую таблицу. Пример. У таблицы Person есть столбец JobID вместо Job. Нам это не нравится. Это была проблема: http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/f8ddb2be-78c9-4296-b293-37b7bc8e8fd7

Итак, что сделал мой напарник, так это "переопределил" соглашение по умолчанию. Пожалуйста, прости, если это не совсем твой случай. Я думаю, что это должно дать вам несколько советов. Это с EF V 4.1

 public class ASRCDb : DbContext, IUnitOfWork
{
    public void Complete()
    {
        SaveChanges();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
        AddAllEntities(modelBuilder);
    }

    static void AddAllEntities(DbModelBuilder modelBuilder)
    {
        var entity = typeof(DbModelBuilder).GetMethod("Entity");
        foreach (var entityType in GetEntityTypes())
        {
            var entityTypeConfiguration = entity.MakeGenericMethod(entityType).Invoke(modelBuilder, null);
            foreach (var propertyInfo in GetReferenceProperties(entityType))
                ConfigureRelationship(propertyInfo, entityTypeConfiguration);
        }
    }

    static IEnumerable<PropertyInfo> GetReferenceProperties(Type entityType)
    {
        return entityType.GetProperties().Where(p => typeof(IEntity).IsAssignableFrom(p.PropertyType));
    }

    static IEnumerable<Type> GetEntityTypes()
    {
        return typeof(Entity).Assembly.GetTypes().Where(type => type.IsClass && !type.IsAbstract);
    }

    static void ConfigureRelationship(PropertyInfo propertyInfo, dynamic entityTypeConfiguration)
    {
        var required = propertyInfo.GetCustomAttributes(typeof(RequiredAttribute), true).Any();
        var navigation = required
                             ? entityTypeConfiguration.HasRequired(GetPropertyExpression(propertyInfo))
                             : entityTypeConfiguration.HasOptional(GetPropertyExpression(propertyInfo));
        UsePropertyNameAsColumnName(propertyInfo, navigation);
    }

    static void UsePropertyNameAsColumnName(PropertyInfo propertyInfo, dynamic navigation)
    {
        Action<ForeignKeyAssociationMappingConfiguration> mapKey = x => x.MapKey(propertyInfo.Name);
        navigation.WithMany().Map(mapKey);
    }

    static dynamic GetPropertyExpression(PropertyInfo propertyInfo)
    {
        var parameter = Expression.Parameter(propertyInfo.ReflectedType);
        return Expression.Lambda(
            typeof(Func<,>).MakeGenericType(propertyInfo.ReflectedType, propertyInfo.PropertyType),
            Expression.Property(parameter, propertyInfo),
            parameter);
    }
}

Вся заслуга моему приятелю Диего Миджельшону.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...