C# 在保存到数据库之前,检查类是否为新实例或至少填充了一次属性
我原以为这很容易,但我想不出一个好办法 用户提交一个网络表单。根据提交的信息,我构建了三个类,并根据收到的数据分配它们的属性:C# 在保存到数据库之前,检查类是否为新实例或至少填充了一次属性,c#,asp.net-mvc,vb.net,entity-framework,nhibernate,C#,Asp.net Mvc,Vb.net,Entity Framework,Nhibernate,我原以为这很容易,但我想不出一个好办法 用户提交一个网络表单。根据提交的信息,我构建了三个类,并根据收到的数据分配它们的属性: UserInfo userInfo = new UserInfo(); UserAddress userAddress = new UserAddress(); UserEmployer userEmployer = new UserEmployer(); 根据提交的信息,有些类最终会填充属性,有些则不会 例如,检查userInfo类是否最终指定了属性的最佳方法是什么
UserInfo userInfo = new UserInfo();
UserAddress userAddress = new UserAddress();
UserEmployer userEmployer = new UserEmployer();
根据提交的信息,有些类最终会填充属性,有些则不会
例如,检查userInfo类是否最终指定了属性的最佳方法是什么?如果某个特定对象没有分配任何实际属性,并且所有属性都设置为null或null,我不想将其保存到数据库中
我只想保存最终至少指定了一个不动产的对象
注:使用NHibernate将数据保存到db尝试创建一个所有三个类都实现的接口,提供一个与shouldSave或hasSetProperties类似的函数,该函数检查每个数据字段,如果定义了其中任何一个字段,则返回true
甚至可以使用一种方法来获取表单中的所有数据,您可以轻松地将其传递到NHibernate。尝试创建一个所有三个类都实现的接口,提供一个与shouldSave或hasSetProperties类似的函数,该函数检查每个数据字段,如果定义了任何字段,则返回true
甚至可以使用一种方法,以一种您可以轻松传递到NHibernate的形式获取所有数据。您可以使用反射和循环属性,分别检查每个属性
var type = userInfo.GetType();
var properties = type.GetProperties();
或者如果它们是字段而不是属性
var fields = type.GetFields();
然后,您可以检查每个属性是否为null或某个值。您可以使用反射和循环遍历属性,分别检查每个属性
var type = userInfo.GetType();
var properties = type.GetProperties();
或者如果它们是字段而不是属性
var fields = type.GetFields();
然后,您可以检查每个对象是否为null或某个值。如果您没有任何可分配给该对象属性的值,请不要创建该对象的实例
其次,“UserAddress”可能不是实体,而是一个值对象。如果您没有任何可分配给该对象属性的值,请不要创建该对象的实例
public interface IPersistable{
bool ShouldPersist {get;}
}
public class MyPersistable:IPersistable
{
private bool _persist;
public MyPersistable(){}
public string MyValue{
get{
return _myValue;
}
set{
_persist = true;// or validate with !IsNullOrEmpty() first
_myValue = value;
}
}
public bool ShouldPersist{
get{
return _persist;
}
}
}
其次,“UserAddress”可能不是实体,而是值对象。对每个字段执行IsNullOrEmpty类型的检查?一定有更简单的办法。。我希望。@Shenaniganz:好吧,物体上所有可以保存的字段。如果这是一个问题,您可能需要重新考虑这些类的设计,并对每个字段执行IsNullOrEmpty类型的检查?一定有更简单的办法。。我希望。@Shenaniganz:好吧,物体上所有可以保存的字段。如果这是一个问题,你可能需要重新考虑这些类的设计。在我看来,将反射用于“正常”任务太粗糙了。采用这种方法可以快速解决问题。反射+Linq:userInfo.GetType.GetProperties.Wherep=>p.GetValueuserInfo,null!=null&&p.GetValueuserInfo,null.ToString=字符串。空;不过,我正在考虑列出一种属性驱动的方法。在我看来,将反射用于“正常”任务实在太粗糙了。采用这种方法可以快速解决问题。反射+Linq:userInfo.GetType.GetProperties.Wherep=>p.GetValueuserInfo,null!=null&&p.GetValueuserInfo,null.ToString=字符串。空;我正在考虑一种列出的属性驱动方法。是的。仅在属性更改时保存-不要仅根据末尾的字段值猜测。可能还需要进一步的步骤-如果对象被持久化,和/或如果对象是从以前的持久化加载的,则可能需要一种方法来重置_persist字段。+1很好的方法,谢谢。不幸的是,它在我的情况下不起作用,因为我在这里使用的是我无法修改的实体类。但也许我会在上面创建一个视图模型。。。让我想想。再次感谢:是的。仅在属性更改时保存-不要仅根据末尾的字段值猜测。可能还需要进一步的步骤-如果对象被持久化,和/或如果对象是从以前的持久化加载的,则可能需要一种方法来重置_persist字段。+1很好的方法,谢谢。不幸的是,它在我的情况下不起作用,因为我在这里使用的是我无法修改的实体类。但也许我会在上面创建一个视图模型。。。让我想想。再次感谢:
public interface IPersistable{
bool ShouldPersist {get;}
}
public class MyPersistable:IPersistable
{
private bool _persist;
public MyPersistable(){}
public string MyValue{
get{
return _myValue;
}
set{
_persist = true;// or validate with !IsNullOrEmpty() first
_myValue = value;
}
}
public bool ShouldPersist{
get{
return _persist;
}
}
}