BreezeSharp-ExecuteQuery失败,并出现NullReferenceException [英] BreezeSharp - ExecuteQuery fails with NullReferenceException

查看:105
本文介绍了BreezeSharp-ExecuteQuery失败,并出现NullReferenceException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经与BreezeJS合作了一段时间,我对此非常感激.当我开始在.NET中开发移动应用程序时,我决定尝试一下BreezeSharp.

I have been working with BreezeJS for a while, and I had grate experience with it. As I started developing mobile application in .NET, I decided to give BreezeSharp a try.

我查看了文档和ToDo示例,并成功创建了

I went through documentation and ToDo sample, and successfully created project explained in http://www.breezejs.com/breeze-sharp-documentation/get-your-feet-wet.

我在现有的Web Api控制器(与BreezeJS配合使用时很好)上执行查询时遇到问题.

I am having an issue with executing query on mine existing Web Api controller (which works great with BreezeJS).

这是查询方法:

    private async Task<IEnumerable<PriceBook>> QueryPriceBooksFrom(EntityManager entityManager)
    {
        try
        {
            var query = new EntityQuery<PriceBook>().From("PriceBooks");
            var result = await entityManager.ExecuteQuery(query);
            return result;
        }
        catch (Exception e)
        {
            MessageBox.Show(e.GetType().Name + ": " + e.Message);
            return new PriceBook[0];
        }
    }

这是BeginInit()中的代码:

And here is code from BeginInit():

        DataContext = this;
        Configuration.Instance.ProbeAssemblies(typeof(PriceBook).Assembly);

        var entityManager = new EntityManager("http://127.0.0.1:81/api/cache/");

        entityManager.MetadataStore.NamingConvention = new NamingConvention().WithClientServerNamespaceMapping("clientNamespace", "serverNamespace");

        entityManager.MetadataStore.AllowedMetadataMismatchTypes = MetadataMismatchType.AllAllowable;

        entityManager.MetadataStore.MetadataMismatch += (s, e) =>
        {
            // Log the mismatch
            var message = string.Format("{0} : Type = {1}, Property = {2}, Allow = {3}",
                                        e.MetadataMismatchType, e.StructuralTypeName, e.PropertyName, e.Allow);
            Console.WriteLine(message);

            // Disallow missing navigation properties on the TodoItem entity type
            if (e.MetadataMismatchType == MetadataMismatchType.MissingCLRNavigationProperty &&
                e.StructuralTypeName.StartsWith("PriceBook"))
            {
                e.Allow = false;
            }
        };

这是控制器方法:

    [HttpGet]
    public IQueryable<PriceBook> PriceBooks(ODataQueryOptions options)
    {
        return ...;
    }

我有从BaseEntity继承的客户端PriceBook类,该类具有服务器PriceBook实体的子集.

I have client PriceBook class inherited from BaseEntity which have subset of server PriceBook entities.

控制器中的元数据方法被命中,但是我无法命中PriceBooks方法.相反,我得到了 NullReferenceException:对象引用未设置为对象的实例.

Metadata method in controller is hit, but I am unable to hit PriceBooks method. Instead I am getting NullReferenceException: Object reference not set to an instance of an object.

我尝试了没有ODataQueryOptions参数和各种版本的EntityQuery的情况,但是没有成功.

I have tried without ODataQueryOptions parameter and with various versions of EntityQuery, but without success.

当我尝试调用entityManager.fetchMetadata()时不会发生异常,但是在获取PriceBook时会再次调用元数据方法.

Exception doesn't occur when I try calling entityManager.fetchMetadata(), but metadata method is called again when fetching PriceBook.

有人知道这可能是什么问题吗?

Does anyone have idea what could be the issue?

修改: 这是问题的StackTrace:

Edit: Here is StackTrace of the issue:

 at Breeze.Sharp.CsdlMetadataProcessor.ParseCsdlDataProperty(StructuralType parentType, JObject csdlProperty, List`1 keyNamesOnServer) in c:\GitHub\breeze.sharp\Breeze.Sharp\CsdlMetadataProcessor.cs:line 136
   at Breeze.Sharp.CsdlMetadataProcessor.<>c__DisplayClass14.<ParseCsdlEntityType>b__10(JToken csdlDataProp) in c:\GitHub\breeze.sharp\Breeze.Sharp\CsdlMetadataProcessor.cs:line 109
   at Breeze.Sharp.Core.EnumerableFns.ForEach[T](IEnumerable`1 items, Action`1 action) in c:\GitHub\breeze.sharp\Breeze.Sharp\Core\EnumerableFns.cs:line 35
   at Breeze.Sharp.CsdlMetadataProcessor.ParseCsdlEntityType(JObject csdlEntityType) in c:\GitHub\breeze.sharp\Breeze.Sharp\CsdlMetadataProcessor.cs:line 108
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Breeze.Sharp.CsdlMetadataProcessor.ProcessMetadata(MetadataStore metadataStore, String jsonMetadata) in c:\GitHub\breeze.sharp\Breeze.Sharp\CsdlMetadataProcessor.cs:line 33
   at Breeze.Sharp.MetadataStore.<FetchMetadata>d__a.MoveNext() in c:\GitHub\breeze.sharp\Breeze.Sharp\MetadataStore.cs:line 166
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Breeze.Sharp.EntityManager.<FetchMetadata>d__3.MoveNext() in c:\GitHub\breeze.sharp\Breeze.Sharp\EntityManager.cs:line 198
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Breeze.Sharp.EntityManager.<ExecuteQuery>d__b.MoveNext() in c:\GitHub\breeze.sharp\Breeze.Sharp\EntityManager.cs:line 230
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Breeze.Sharp.EntityManager.<ExecuteQuery>d__6`1.MoveNext() in c:\GitHub\breeze.sharp\Breeze.Sharp\EntityManager.cs:line 208
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at StanleySteemer.Nimbus.Mobile.MainWindow.<QueryPriceBooksFrom>d__9.MoveNext() in c:\Projects\SSI\Nimbus\source\StanleySteemer.Nimbus.Mobile\MainWindow.xaml.cs:line 109

解决方案: 我发现问题出在枚举属性上. 我已经在客户端上省略了的服务器上需要枚举属性:

Solution: I figured out that issue was with enum property. I have required enum property on server that I omitted on client:

[必填] 公用DataStore数据存储{放; }

[Required] public DataStore DataStore { get; set; }

我通过将此属性添加到客户端来解决了空引用问题. 现在我在解析该枚举时遇到问题,但这是另一个问题.

I fixed null reference issue by adding this property to client side. Now I have issue with parsing that enum, but that is for another question.

推荐答案

感谢您尝试Breeze.sharp.

Thanks for trying Breeze.sharp.

我尝试修改我们的湿脚"示例,使其看起来更像您的代码,但是我无法重现此异常.这是几个请求:

I’ve tried modifying our "wet feet" example to look more like your code, but I’ve been unable to reproduce this exception. Here are a couple of requests:

  1. 由于命中了元数据方法,并且您的服务可与Breezejs一起使用,因此您应该能够通过将浏览器指向来命中PriceBooks方法.

  1. Since the metadata method is hit and your service works with Breezejs, you should be able to hit the PriceBooks method by pointing your browser at

http://127.0.0.1:81/api/cache/PriceBooks

您能否确认这会产生所有PriceBook的Json表示形式.

Could you confirm that this yields Json representations of all of your PriceBooks.

  1. 由于这看起来像是客户端异常,是否可以在ExecuteQuery()调用周围的catch()块中放置一个断点,检查null引用异常并将堆栈跟踪发送给我?如果有任何内部异常,也请向我发送其类型,消息和堆栈跟踪.

更新:

我们已重现此问题.在下一个版本中,我们将添加更多信息.

We have reproduced this problem. We'll add a more informative message in the next release.

这篇关于BreezeSharp-ExecuteQuery失败,并出现NullReferenceException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆