以编程方式获取entity framework中的Property的’Nullable’状态

我需要为EF中的字段获取Nullable属性。 一些魔法代码需要在Nullable = True的属性上完成,我找不到一个有效的解决方案来获取属性。

foreach (PropertyInfo property in (PropertyInfo[])type.GetProperties()) { var getPropertyType = property.GetMethod.ReturnTypeCustomAttributes.ToString(); var getValue = property.GetValue(model); bool isNullable = property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable); // isNullable always returns false !!!! and I need it to return true if the field is allowed to be null if ((getValue == null) && (!isNullable)) { } } 

 // This code was generated from a template. // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. //  //------------------------------------------------------------------------------ namespace testApp.Data { using System; using System.Collections.Generic; public partial class Person { public int PersonId { get; set; } public string Email { get; set; } } } 

任何帮助,将不胜感激。

所以你想要在数据库中可以为空的属性。 这意味着“一些魔术代码”应该考虑EDMX的存储模型。 类模型不包含此信息,更不用说生成的类。

以下是如何获取存储模型中所有可空属性的列表:

 var tableName = "someTable"; var oc = ((IObjectContextAdapter)context).ObjectContext; var items = oc.MetadataWorkspace.GetItems(DataSpace.SSpace).OfType(); foreach (var entityType in items.Where(e => e.Name == tableName)) { var props = string.Join(",", entityType.Properties.Where(p => p.Nullable)); Debug.WriteLine(string.Format("{0}: {1}", entityType.Name, props)); } 

您可以使用Nullable.GetUnderlyingType方法

 if (Nullable.GetUnderlyingType(propertyType) != null) { // It's nullable }