重写SaveChanges方法以设置所有不可为null的实体属性
本文关键字:null 属性 实体 方法 SaveChanges 设置 重写 | 更新日期: 2023-09-27 18:28:27
我们的数据库的设置方式是,对于每个表,所有列都不允许为null。当使用实体框架添加新记录时,为每个属性设置一个值会变得非常麻烦。基本上,我想避免这种情况:
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.nempty,而int类型的每一个实体属性都必须设置为0,依此类推。这可能吗,更重要的是,用这种方法解决我的问题有意义吗?提前谢谢。
您可以直接在构造函数中执行此操作。
在实体框架中,实体类被定义为分部类。您可以扩展它们,并添加一个构造函数或进行初始化的工厂方法:
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();
}
它应该起作用,但也许,您应该处理"特殊"属性,如导航属性。