【问题标题】:Bug with OData virtual navigation propertyOData 虚拟导航属性的错误
【发布时间】:2020-04-27 22:35:10
【问题描述】:

我有一个父子类:

public class SharedCarBundle : SharedEntity, ISharedCarBundle, ISharedEntity
    {
        public SharedCarBundle();

        public virtual SharedCar Car { get; set; }

    }

    public class CarBundle : SharedCarBundle, ISharedCarBundle, ICarAssigned
    {

          [Value]
        public new virtual Car Car { get; set; }

        /// <summary>
        /// The Car the bundle is of
        /// </summary>
        ISharedCar ISharedCarBundle.Car
        {
            get
            {
                return Car;
            }
            set
            {
                Car = (Car)value;
            }
        }
    }

在使用 Odata Get Request 时,我总是只取回父属性的 null 值,而不是子类中 Car 属性中的原始值。

我做错了什么,我应该怎么做才能检索到正确的值? 注意:虚拟属性不可更改。

【问题讨论】:

  • 对不起,我没看懂你的源代码。 - 你在哪里实现虚拟属性“Car”的getter?
  • 实际上这个虚拟属性覆盖了父接口 ISharedCarBundle 中的另一个属性,这就是我使用 new 关键字的原因。实现在这里: ISharedCar ISharedCarBundle.Car { get { return Car; } 设置 { 汽车 = (汽车) 价值;这里的 getter 检索上面带有值注释的 Car 对象。 @Michael Schönbauer

标签: c# odata


【解决方案1】:

最后,我自己找到了解决方案。 问题是我从几个类继承,显然,当导航属性在父类中定义为虚拟时,Odata 只会看到父类的 null 值,并且永远不会识别子类中被覆盖的属性。

因此我的建议是在使用 Odata 时,请仅使用平面类结构,如果您需要使用继承,请仅使用接口,并且您将传递给 Odata 模型的类不应从其他类继承,而应仅从接口。

【讨论】:

  • 当我开始整个 odata 低代码方法时,我从 ConventionModelBuilder 文档中提取了很多内容,它确实解释了很多关于为什么以及如何将您的类和属性解释为 odata docs.microsoft.com/en-us/odata/webapi/convention-model-builder
  • 非常感谢。这真的很有帮助,因为我是从这里开始的,而且我一直想知道窗帘后面的事情是如何运作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2013-11-18
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多