Максимальная длина поля в структуре Entity
Мне нужно поставить максимальную длину в моем тестовом поле в своих представлениях с помощью ASP.NET MVC с помощью Entity Framework, и я не могу найти, как получить максимальную длину поля varchar.
Есть ли простой способ получить это или любое другое свойство поля базы данных
Ответы
Ответ 1
Вот как мне это удается (с помощью метода расширения для сущностей):
public static int? GetMaxLength(this EntityObject entite, string nomPropriete)
{
int? result = null;
using (XEntities contexte = XEntities.GetCurrentContext())
{
var queryResult = from meta in contexte.MetadataWorkspace.GetItems(DataSpace.CSpace)
.Where(m => m.BuiltInTypeKind == BuiltInTypeKind.EntityType)
from p in (meta as EntityType).Properties
.Where(p => p.DeclaringType.Name == entite.GetType().Name
&& p.Name == nomPropriete
&& p.TypeUsage.EdmType.Name == "String")
select p.TypeUsage.Facets["MaxLength"].Value;
if (queryResult.Count() > 0)
{
result = Convert.ToInt32(queryResult.First());
}
}
return result;
}
Ответ 2
Обновление
Я понимаю, что этот ответ прямо не применим к EF. В то время, когда я ответил, ответов не было около 20 минут, и я подумал, что знать, как я решил подобную проблему с LINQToSQL, может помочь. Учитывая, что OP в основном использовал тот же метод, хотя и с свойствами EF, кажется, указывает на то, что я сделал правильный выбор. Я оставляю этот ответ здесь для контекста и для тех, кто здесь имеет ту же проблему, но с LINQToSQL.
Оригинал
Я не знаю об EF, но свойства объекта LINQToSQL оформлены ColumnAttributes. Вы можете получить ColumnAttribute из PropertyInfo для свойства, посмотрев на CustomAttributesCollection. Значение этого атрибута необходимо проанализировать по длине. Я делаю это в своих классах валидатора, чтобы убедиться, что я не получу ошибку SQL, используя слишком длинную строку для моего столбца.
Это метод, который я использую для извлечения длины столбца для свойств строки.
public static int MaximumPropertyLength( Type type, string propertyName )
{
int maximumLength = -1;
PropertyInfo info = type.GetProperty( propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance );
if (info != null)
{
var attribute = info.GetCustomAttributes( typeof( ColumnAttribute ), false )
.Cast<ColumnAttribute>()
.FirstOrDefault();
if (attribute != null)
{
maximumLength = ExtractLength( attribute.DbType );
}
}
return maximumLength;
}
private static int ExtractLength( string dbType )
{
int max = int.MaxValue;
if (dbType.Contains( "(" ))
{
string[] parts = dbType.Split( new char[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries );
if (parts.Length > 1)
{
int.TryParse( parts[1], out max );
}
}
return max;
}
Ответ 3
Для EntityFramework вам нужно будет добавить свои собственные атрибуты к классам с помощью генератора кода или шаблона T4.
Тогда то, что сказал вышеупомянутый тванфоссон. EF по умолчанию не сохраняет эту информацию.
http://blogs.msdn.com/adonet/archive/2008/01/24/customizing-code-generation-in-the-ado-net-entity-designer.aspx
Объясняет больше, что я говорю с генератором кода. Это довольно пятно. Я сделал то, о чем вы уже упоминали, проблема связана с проприетарным кодом, поэтому у меня нет примера для вас.