0

我们为 BOM 使用 codefluent 实体,为控制器使用 webapi,在客户端使用 angularjs 框架。

在父对象中存储对象的引用时,我们面临一个问题。任何时候,生成的代码都会使引用无效。

给定两个具有关系 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 当前为空)。

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

提前感谢您的回答;

4

1 回答 1

1

我可能正在回答我自己的问题,但是当使用delete objectA.entB而不是objectA.entB = nullStream 时不会包含 entB 属性,因此不会通过它的设置器。

于 2016-03-03T10:02:24.690 回答