关系中的序列化方法

时间:2016-03-03 09:34:45

标签: codefluent

我们在BOM中使用了codefluent实体,在客户端使用了控制器的webapi和angularjs Framework。

在父对象中存储对象的引用时,我们遇到了问题。任何时候,引用都将被生成的代码清空。

给定两个具有关系EntA [EntAId,prop1,EntB]和EntB [EntBId,prop1,prop2]的实体 我最终得到了两个课程:

class EntA{
   EntAId
   prop1
   EntB
   EntBEntBId
}

class EntB{
   EntBId
   prop1
   prop2
}

CodeFluent已生成以下代码:

        [System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
    [System.ComponentModel.DataObjectFieldAttribute(true)]
    public System.Guid EntBEntBId
    {
        get
        {
            if (((this._EntBEntBId.Equals(CodeFluentPersistence.DefaultGuidValue) == true) 
                        && (this._entB != null)))
            {
                this._EntBEntBId = this._entB.EntBId;
            }
            return this._EntBEntBId;
        }
        set
        {
            if ((System.Collections.Generic.EqualityComparer<System.Guid>.Default.Equals(value, this.EntBEntBId) == true))
            {
                return;
            }
            this._entB = null;
            this._EntBEntBId = value;
            this.EntityState = CodeFluent.Runtime.CodeFluentEntityState.Modified;
            this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("EntB"));
            this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("EntBEntBId"));
        }
    }

    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public Namespace.EntB.EntB EntB
    {
        get
        {
            if ((this._entB == null))
            {
                this._entB = Namespace.EntB.EntB.Load(this._EntBEntBId);
            }
            return this._entB;
        }
        set
        {
            this._EntBEntBId = CodeFluentPersistence.DefaultGuidValue;
            this._entB = value;
            this.EntityState = CodeFluent.Runtime.CodeFluentEntityState.Modified;
            this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("EntB"));
            this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("EntBEntBId"));
        }
    }

在客户端(使用Angular)我想注册objectA.EntBEntBId而不发送整个EntB对象。因此,我会考虑下面的代码片段来取消EntB。

if(objectA.EntB)
    objectA.EntB = null

最终将正确的Stream发送到服务器(没有整个B对象被序列化)。

当触发HTTP PUT调用时,webapi将首先通过get / set方法对类进行评估。属性EntBEntBId将被正确评估,但然后设置EntB属性将保持删除以前的值(因为EntB当前为null)。

有没有办法避免这种行为?

提前感谢您的回答;

1 个答案:

答案 0 :(得分:1)

我可能会回答我自己的问题,但在使用delete objectA.entB代替objectA.entB = null时,Stream不会包含entB属性,因此不会通过它的setter。