代码之家  ›  专栏  ›  技术社区  ›  Asaf R

如何在.net 4中找到实体框架中字段的最大长度?

  •  9
  • Asaf R  · 技术社区  · 14 年前

    根据 this 问题是,ef v1中没有内置的方法来计算字段的长度。有没有 内置的 如何在.net 4附带的实体框架中实现这一点,如果是-如何实现?

    2 回复  |  直到 10 年前
        1
  •  7
  •   Community Egal    7 年前

    在ef 4.0中没有新的方法来访问属性的长度。您仍然需要浏览元数据-如图所示 in the accepted answer on the question you reference .

    亚历克斯·詹姆斯

    前英孚队员!

        2
  •  0
  •   Jan Jurníček    11 年前

    这种行为:

    using System;
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    using System.Data.Metadata.Edm;
    using System.Linq;
    using System.Linq.Expressions;
    
    namespace EfWidgets
    {
        public class EntityWidgets
        {
            public static int GetMaxLength<TEntity>(ObjectContext oc, Expression<Func<TEntity, string>> property)
                where TEntity : EntityObject
            {
                var test = oc.MetadataWorkspace.GetItems(DataSpace.CSpace);
    
                if (test == null)
                    return -1;
    
                Type entType = typeof(TEntity);
                string propertyName = ((MemberExpression)property.Body).Member.Name;
    
                var q = test
                    .Where(m => m.BuiltInTypeKind == BuiltInTypeKind.EntityType)
                    .SelectMany(meta => ((EntityType)meta).Properties
                    .Where(p => p.Name == propertyName && p.TypeUsage.EdmType.Name == "String"));
    
                var queryResult = q.Where(p =>
                {
                    var match = p.DeclaringType.Name == entType.Name;
                    if (!match)
                        match = entType.Name == p.DeclaringType.Name;
    
                    return match;
    
                })
                    .Select(sel => sel.TypeUsage.Facets["MaxLength"].Value)
                    .ToList();
    
                if (queryResult.Any())
                {
                    int result = Convert.ToInt32(queryResult.First());
                    return result;
                }
                return -1;
            }
        }
    }