如何确定数据库中哪些字段指定为NOT NULL?

RLH*_*RLH 1 c# entity-framework entity-framework-6

我的解决方案中有一个数据库优先,代码生成的EF数据项目.

我需要做的是确定我的模型中的哪些字段被定义为NOT NULL(即需要)在数据库中.这对于值类型(整数,浮点数,小数等)并不困难,因为如果DB允许空值,则它们被EF代码生成器定义为可空类型.

但是,当字段是引用类型时,我无法弄清楚如何确定字段是否定义为数据库中的NULL/ NOT NULL.

这似乎是一个显而易见的问题,但我无法通过Google或其他方式找到解决方案.使用EF模型时,如何在保存操作成功之前查询模型上是否需要填充哪些字段?

一种不同的方法

在重新访问这个问题之后,我想我会做一些进一步的研究.首先,通过Visual Studio添加实体,在单步执行EF向导后,.edmx生成了一个文件.我之前已多次访问此文件,并且我已更新并将表添加到此文件中.

今天,我决定在设计师中打开它并查看我的一些领域的一些属性.果然,我的nvarchar NOT NULL田地上有一个叫做的属性Nullable.

那么,我如何使用EF并获取Nullable属性设置为的实体的字段列表false

Ger*_*old 5

您可以从Entity Framework的元数据中获取此信息:

var metadata = ((IObjectContextAdapter)db).ObjectContext.MetadataWorkspace;
var tables = metadata.GetItemCollection(DataSpace.SSpace)
                     .GetItems<EntityContainer>().Single()
                     .BaseEntitySets
                     .OfType<EntitySet>()
                     .Where(s => !s.MetadataProperties.Contains("Type") || s.MetadataProperties["Type"].ToString() == "Tables");

foreach (var table in tables)
{
    Console.WriteLine(string.Format("{0}.{1}", table.Schema, table.Name));
    foreach (var member in table.ElementType.Members)
    {
        var column = string.Format("    {0}, Nullable: {1}",
            member.Name,
            ((TypeUsage)member.MetadataProperties["TypeUsage"].Value).Facets["Nullable"].Value);
        Console.WriteLine(column);
    }
}
Run Code Online (Sandbox Code Playgroud)

(其中,dbDbContext)

这将为您提供如下输出:

dbo.Category
    CategoryId, Nullable: False
    CategoryName, Nullable: False
    Description, Nullable: True
    RowVersion, Nullable: False
dbo.Product
    ProductId, Nullable: False
    ProductName, Nullable: False
    QuantityPerUnit, Nullable: False
    UnitPrice, Nullable: True
    StartDate, Nullable: False
    RowVersion, Nullable: False
    Image, Nullable: True
dbo.CategoryProduct
    CategoryID, Nullable: False
    ProductID, Nullable: False
Run Code Online (Sandbox Code Playgroud)

我从Rowan Miller那里借了第一部分.