如何在c#EF中获取DB表列是否为可空或不可为空

时间:2016-02-17 11:24:00

标签: entity-framework c#-4.0

SELECT COLUMN_NAME,IS_NULLABLE 
FROM [DB].INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Test'

我想在c#Entity Framework中实现上述查询结果。我可以使用

获取列名
typeof(Test).GetProperties().Select(a => a.Name).ToList<string>();

如何获取可空列的值?

2 个答案:

答案 0 :(得分:2)

您可以使用EF元数据来获取某个实体及其属性的配置。这是扩展方法(注意 - 为简单起见没有验证):

public static EdmProperty GetPropertyConfiguration<TEntity>(this DbContext context,
    Expression<Func<TEntity, object>> selector)
    where TEntity : class
{
    var objectContext = ((IObjectContextAdapter)context).ObjectContext;
    var workspace = objectContext.MetadataWorkspace;
    var identity = $"CodeFirstDatabaseSchema.{typeof(TEntity).Name}";
    var entity = workspace.GetItem<EntityType>(identity, DataSpace.SSpace);
    var propertyName = GetPropertyName(selector);

    return entity.Members.OfType<EdmProperty>()
         .FirstOrDefault(p => p.Name == propertyName);
}    

private static string GetPropertyName<TEntity> (Expression<Func<TEntity, object>> selector)
{
    var expression = (MemberExpression)selector.Body;
    return expression.Member.Name;
}

此方法检查实体配置的存储模型空间。然后它按属性名称获取属性(列)配置(同样,此处不进行验证)。用法很简单:

var property = context.GetPropertyConfiguration<Test>(t => t.Test);
var isNullable = property.Nullable;

您还可以在此处检查其他配置设置 - DefaultValue,MaxLength等。当然,您可以将属性名称作为字符串传递 - 只需创建另一个扩展方法的重载。

注意:如果您使用的是DB first方法,那么您需要使用另一个标识来搜索工作区中的项目。它应该看起来像"{your_model_name}.Store.{entityName}"

答案 1 :(得分:0)

您的实体模型应具有与标有error: invalid static_cast from type ‘const size_t* {aka const long unsigned int*}’ to type ‘nts::Tristate*’ this->_components[0] = static_cast<nts::Tristate *>(&value); 的非可空数据库列对应的属性。因此,您可以检查是否存在属性:

System.ComponentModel.DataAnnotations.RequiredAttribute