C# 使用Entity Framework和C检查列是否可为空的查询
要在SQL中确定列是否可以有空值,请执行以下操作: SELECT可为空 从信息_SCHEMA.COLUMNS 其中,表_SCHEMA='dbo' 和TABLE_NAME='TABLE_NAME'C# 使用Entity Framework和C检查列是否可为空的查询,c#,sql,entity-framework,nullable,C#,Sql,Entity Framework,Nullable,要在SQL中确定列是否可以有空值,请执行以下操作: SELECT可为空 从信息_SCHEMA.COLUMNS 其中,表_SCHEMA='dbo' 和TABLE_NAME='TABLE_NAME' COLUMN_NAME='COLUMN_NAME'您可以尝试解决您的问题- 使用EF SqlQuery而不是EXECUTESQLCOMAND作为- SYS.COLUMNS是一个系统表,用于维护数据库中列的信息。对于数据库中添加的每一列,都会在SYS.COLUMNS表中创建一条记录。您可以尝试解决以下问
COLUMN_NAME='COLUMN_NAME'您可以尝试解决您的问题- 使用EF SqlQuery而不是EXECUTESQLCOMAND作为-
SYS.COLUMNS是一个系统表,用于维护数据库中列的信息。对于数据库中添加的每一列,都会在SYS.COLUMNS表中创建一条记录。您可以尝试解决以下问题: 使用EF SqlQuery而不是EXECUTESQLCOMAND作为-
SYS.COLUMNS是一个系统表,用于维护数据库中列的信息。对于数据库中添加的每一列,都会在SYS.COLUMNS表中创建一条记录。如前所述,如果使用EF6,则可以执行查询并返回结果 然而,如果你准备弄脏你的手并询问EF本身,那么不做查询就可以从EF6中获得这些信息。让我们面对现实吧,英孚需要知道这类事情来完成它的工作,对吗 首先,这要归功于我们的勇气 下面是我用来获取实体审计类似信息的方法的修改。它为指定的模型属性计算相应的存储属性,在本例中,返回该列是否可为null
public static class DbContextExtensions
{
public static bool IsPropertyNullableFor(this DbContext context, Type type, string propertyName)
{
var metadataWorkspace = ((IObjectContextAdapter) context).ObjectContext.MetadataWorkspace;
var objectItemCollection = (ObjectItemCollection) metadataWorkspace.GetItemCollection(DataSpace.OSpace);
var entityType = metadataWorkspace
.GetItems<EntityType>(DataSpace.OSpace)
.Single(e => objectItemCollection.GetClrType(e) == type);
var entitySet = metadataWorkspace.GetItems<EntityContainer>(DataSpace.CSpace)
.Single()
.EntitySets
.Single(s => s.ElementType.Name == entityType.Name);
var entitySetMapping = metadataWorkspace
.GetItems<EntityContainerMapping>(DataSpace.CSSpace)
.Single()
.EntitySetMappings
.Single(s => s.EntitySet.Equals(entitySet));
var column = entitySetMapping
.EntityTypeMappings.Single()
.Fragments.Single()
.PropertyMappings
.OfType<ScalarPropertyMapping>()
.Single(m => m.Property.Name == propertyName)
.Column;
return column.Nullable;
}
}
您可以使用泛型/表达式来收紧接口,这只是一个如何操作的演示。如前所述,如果使用EF6,您可以执行查询并返回结果 然而,如果你准备弄脏你的手并询问EF本身,那么不做查询就可以从EF6中获得这些信息。让我们面对现实吧,英孚需要知道这类事情来完成它的工作,对吗 首先,这要归功于我们的勇气 下面是我用来获取实体审计类似信息的方法的修改。它为指定的模型属性计算相应的存储属性,在本例中,返回该列是否可为null
public static class DbContextExtensions
{
public static bool IsPropertyNullableFor(this DbContext context, Type type, string propertyName)
{
var metadataWorkspace = ((IObjectContextAdapter) context).ObjectContext.MetadataWorkspace;
var objectItemCollection = (ObjectItemCollection) metadataWorkspace.GetItemCollection(DataSpace.OSpace);
var entityType = metadataWorkspace
.GetItems<EntityType>(DataSpace.OSpace)
.Single(e => objectItemCollection.GetClrType(e) == type);
var entitySet = metadataWorkspace.GetItems<EntityContainer>(DataSpace.CSpace)
.Single()
.EntitySets
.Single(s => s.ElementType.Name == entityType.Name);
var entitySetMapping = metadataWorkspace
.GetItems<EntityContainerMapping>(DataSpace.CSSpace)
.Single()
.EntitySetMappings
.Single(s => s.EntitySet.Equals(entitySet));
var column = entitySetMapping
.EntityTypeMappings.Single()
.Fragments.Single()
.PropertyMappings
.OfType<ScalarPropertyMapping>()
.Single(m => m.Property.Name == propertyName)
.Column;
return column.Nullable;
}
}
您可以使用泛型/表达式来收紧接口,这只是演示如何操作。ExecuteSqlCommand只返回受影响的行数,不用于查询数据,这就是为什么您得到-1ExecuteSqlCommand只返回受影响的行数,不用于查询数据,这就是为什么您会得到-1一般来说,我不建议有人使用sys.*表而不是information_schema.*视图,后者是ISO标准,前者更可能因供应商而异。在这种情况下,您可能会发现信息模式由sys.*表支持。一般来说,我不建议使用sys.*表而不是信息模式。*视图,后者是ISO标准,前者更可能因供应商而异。在本例中,您可能会发现信息_模式由sys.*表支持。
public static class DbContextExtensions
{
public static bool IsPropertyNullableFor(this DbContext context, Type type, string propertyName)
{
var metadataWorkspace = ((IObjectContextAdapter) context).ObjectContext.MetadataWorkspace;
var objectItemCollection = (ObjectItemCollection) metadataWorkspace.GetItemCollection(DataSpace.OSpace);
var entityType = metadataWorkspace
.GetItems<EntityType>(DataSpace.OSpace)
.Single(e => objectItemCollection.GetClrType(e) == type);
var entitySet = metadataWorkspace.GetItems<EntityContainer>(DataSpace.CSpace)
.Single()
.EntitySets
.Single(s => s.ElementType.Name == entityType.Name);
var entitySetMapping = metadataWorkspace
.GetItems<EntityContainerMapping>(DataSpace.CSSpace)
.Single()
.EntitySetMappings
.Single(s => s.EntitySet.Equals(entitySet));
var column = entitySetMapping
.EntityTypeMappings.Single()
.Fragments.Single()
.PropertyMappings
.OfType<ScalarPropertyMapping>()
.Single(m => m.Property.Name == propertyName)
.Column;
return column.Nullable;
}
}
Console.WriteLine("Is id nullable?: " + dbContext.IsPropertyNullableFor(typeof(MyClass), nameof(MyClass.Id)));