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?
您可以从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)
(其中,db是DbContext)
这将为您提供如下输出:
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那里借了第一部分.