以编程方式获取实体框架中属性的"可为空"状态



我需要为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.
// </auto-generated>
//------------------------------------------------------------------------------
namespace testApp.Data
{
    using System;
    using System.Collections.Generic;
    public partial class Person
    {
        public int PersonId { get; set; }
        public string Email { get; set; }
    }
}

如有任何帮助,我们将不胜感激。

因此,您需要数据库中可以为null的属性。这意味着"一些神奇的代码"应该研究EDMX的存储模型。类模型不包含这些信息,更不用说生成的类了。

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

var tableName = "someTable";
var oc = ((IObjectContextAdapter)context).ObjectContext;
var items = oc.MetadataWorkspace.GetItems(DataSpace.SSpace).OfType<EntityType>();
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
}

相关内容

  • 没有找到相关文章

最新更新