Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Entity Framework和C检查列是否可为空的查询_C#_Sql_Entity Framework_Nullable - Fatal编程技术网

C# 使用Entity Framework和C检查列是否可为空的查询

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表中创建一条记录。您可以尝试解决以下问

要在SQL中确定列是否可以有空值,请执行以下操作:

SELECT可为空 从信息_SCHEMA.COLUMNS 其中,表_SCHEMA='dbo' 和TABLE_NAME='TABLE_NAME'
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)));