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;
        }
    }
}