覆盖SaveChanges方法以设置所有不可空的实体属性

时间:2013-08-20 20:18:45

标签: c# entity-framework entity-framework-5

我们的数据库设置方式是,对于每个表,所有列都不允许空值。使用实体框架添加新记录时,为每个属性设置一个值变得非常烦人。基本上,我想避免这个:

var customer = new usr_Customer();        
customer.CUSTNMBR = customerNumber != null ? customerNumber : string.Empty;
customer.MerchantID = merchant.MerchantId != null ? merchant.MerchantId : string.Empty;
customer.SupplyClubID = merchant.SupplyClub != null ? merchant.SupplyClub : string.Empty;
customer.Group01 = merchant.Group01 != null ? merchant.Group01 : string.Empty;

要解决此问题,我想覆盖SaveChanges()方法,并为每个null属性设置一个值。以下是我到目前为止的情况:

public override int SaveChanges()
{
    var changeSet = ChangeTracker.Entries();

    if (changeSet != null)
    {
        foreach (var entry in changeSet.Where(c => c.State == EntityState.Added))
        {
            //If entity properties are null, set them to something.
        }
    }
    return base.SaveChanges();

}

此时,我不知道该怎么办,因为我不太了解EF。我知道string类型的每个实体属性都需要设置为string.empty,并且对于int类型的每个实体属性,都需要设置为0,依此类推。这是否可行,更重要的是,用这种方法解决我的问题是否有意义?提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以直接在构造函数中执行此操作。

在实体框架中,实体类定义为partial。您可以扩展它们并添加执行初始化的构造函数或工厂方法:

public partial class usr_Customer
{
    public usr_Customer()
    {
        MerchantID = string.Empty;
    }
}

编辑:我通过反射在代码中添加了属性初始化:

public override int SaveChanges()
{
    var changeSet = ChangeTracker.Entries();

    if (changeSet != null)
    {
        foreach (var entry in changeSet.Where(c => c.State == EntityState.Added))
        {
            Type entityType = entry.GetType();
            //Get all the properties
            var properties = entityType.GetProperties();
            foreach(var property in properties)
            {
                var value = property.GetValue(entry);
                //If the property value is null, initialize with a default value
                if(value == null)
                {
                    //Get the default value of the property
                    var defaultValue = Activator.CreateInstance(property.PropertyType);
                    property.SetValue(defaultValue, entry, null);
                }
             }
        }
    }
    return base.SaveChanges();

}

它应该可以工作,但也许你应该处理像导航属性这样的“特殊”属性。