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>();
如何获取可空列的值?
答案 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