Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate是否覆盖映射的设置器?_C#_Nhibernate - Fatal编程技术网

C# NHibernate是否覆盖映射的设置器?

C# NHibernate是否覆盖映射的设置器?,c#,nhibernate,C#,Nhibernate,我想在NHibernate映射对象中执行此操作: private ShiftTradeOffer m_Offer; public virtual ShiftTradeOffer Offer{ get { return m_Offer; } set { //... Do some stuff ... if (condition) {

我想在NHibernate映射对象中执行此操作:

    private ShiftTradeOffer m_Offer;

    public virtual ShiftTradeOffer Offer{ 
        get {
            return m_Offer;
        }
        set {

            //... Do some stuff ...

            if (condition)
            {
                m_Offer = value;
            } else {
                throw new Exception("whoops!");
            }

        }
    }
(ShiftTradeOffer是映射属性)

1) 这类事情会带来问题吗

2) 创建对象时是否调用此setter

3) 就强制验证而言,这是否违反了最佳实践?我希望在这个类中嵌入特定于对象的行为。

1)根据定义,属性永远不会抛出异常。您的方法违反了此最佳实践

2)调用原始setter是因为NHibernate只创建了一个代理来调用底层getter/setter。 我们使用包含序列化逻辑的属性来映射序列化数据,否则将无法工作

例如:

public virtual List<Foo> Foos {get;set;}
public virtual string SerializedFoos 
{
    get { return JsonConvert.Serialize(Foos); }
    set { Foos = JsonConvert.Deserialize<List<Foo>>(value); }
}
公共虚拟列表Foos{get;set;}
公共虚拟字符串序列化oos
{
获取{return JsonConvert.Serialize(Foos);}
set{Foos=JsonConvert.Deserialize(value);}
}
只有
SerializedFoos
属性被映射,域代码与
Foos
属性一起工作。因此,NHibernate将漂亮的JSON写入数据库,而域可以使用一个方便的列表而不受性能影响,因为(反)序列化只在加载/保存对象时发生

3)需要验证的实践很多,有些人更喜欢属性,有些人更喜欢每个域对象的验证类

我会选择后一种方法,因为它最灵活,不会弄乱数据对象,并且可以轻松地验证整个对象

属性方式的一个搜索术语是“数据注释”。谷歌给出了这个结果,例如:


如果您进行数据绑定,您可以查看
IDataErrorInfo
界面。

谢谢您的指导。我很高兴我问了。限制属性中可以分配的内容是否仍然有效?将有效性逻辑添加到SETER中是完全有效的,但是您应该考虑对验证技术的要求是什么。通常,您必须验证依赖于其他属性的属性值(即startdate