MobileServiceInvalidOperationException:错误:请求错误

时间:2015-07-31 10:06:26

标签: c# azure azure-storage azure-mobile-services xamarin.forms

我一直在努力尝试将数据上传到Azure数据库(移动服务)数小时。我在Azure数据库上的数据模型: Azure model

我在Xamarin Forms中的模型(该类):

public class Test
{
    public string Id { get; set; }

    [JsonProperty("XAxis")]
    public int XAxis { get; set; }
    [JsonProperty("YAxis")]
    public int YAxis { get; set; }
}

将数据写入Azure:

var test = new Test
{
    XAxis = 100,
    YAxis = 200
};
await client.GetTable<Test>().InsertAsync(test);

然而,当我执行此操作时,我将收到以下错误:

07-31 11:44:39.285 I/MonoDroid(27512): Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException: Error: Bad request.

当我查看Azure后端时,我会收到有关ID应填写的投诉:

Error: [Microsoft][SQL Server Native Client 10.0][SQL Server]Cannot insert the value NULL into column 'ID', table 'my_db.database.Test'; column does not allow nulls. INSERT fails. (SqlState: 23000, Code: 515)

所以我假设我应该添加一个写入Azure的ID字段:

var test = new Test
{
    Id = Convert.ToString(System.Math.Abs((int)(DateTime.Now.Ticks))),
    XAxis = 100,
    YAxis = 200
};
await client.GetTable<Test>().InsertAsync(test);

但是当我运行此操作时,我会收到投诉,指出您无法为属性ID指定值:

07-31 11:56:39.030 I/MonoDroid(28240): Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException: Error: A value cannot be specified for property 'id'
07-31 11:56:39.030 I/MonoDroid(28240): at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <IL 0x00011, 0x00078>
07-31 11:56:39.030 I/MonoDroid(28240): at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (object) <IL 0x00006, 0x0006b>
07-31 11:56:39.030 I/MonoDroid(28240): at Android.App.SyncContext/<Post>c__AnonStorey0.<>m__0 () <IL 0x0000c, 0x0005b>
07-31 11:56:39.030 I/MonoDroid(28240): at Java.Lang.Thread/RunnableImplementor.Run () <IL 0x00011, 0x00097>
07-31 11:56:39.030 I/MonoDroid(28240): at Java.Lang.IRunnableInvoker.n_Run (intptr,intptr) <IL 0x0000a, 0x000a3>
07-31 11:56:39.030 I/MonoDroid(28240): at (wrapper dynamic-method) object.b57781da-7718-463b-816c-da6f6ddaedad (intptr,intptr) <IL 0x00011, 0x0003b>
07-31 11:56:39.035 W/art     (28240): JNI RegisterNativeMethods: attempt to register 0 native methods for md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable
07-31 11:56:39.037 D/AndroidRuntime(28240): Shutting down VM

我尝试将数据库字段设为int和varchar。我尝试在我的应用中更改模型(Test.cs),以便它也使用JsonProperty作为ID字段,我已尝试使用ID&#39;, &#39;标识&#39;并且&#39; id&#39;作为Azure和C#中的字段,但没有任何方法可行。它要么抱怨必须填写ID,要么让它为空。

所以我的问题是将记录写入Azure的确切方法是什么?我应该在C#中包含ID字段还是不应该包含ID字段,我是否应该更改JsonProperty,...?

谢谢, Yenthe

1 个答案:

答案 0 :(得分:0)

好吧,所以我找到了解决方案。虽然找到的每个信息都是关于id的int或string字段,但它应该是nvarchar(长度255)。默认值应设置为(CONVERT([nvarchar](255),newid(),(0))),这样您就不必指定任何ID,它们将由Azure自动生成。 所以一个示例模型: Example model

然后,您可以创建一个与Azure上的模型同名的类,并添加所有字段:

public class Measure
{
    public string Id { get; set; }
    public int XAxis { get; set; }
    public int YAxis { get; set; }
    public int ZAxis { get; set; }
    public int LongSensor { get; set; }
}

最终将数据发送到Azure:

Measure measure = new Measure { XAxis = 100, YAxis = 200, ZAxis = 300, LongSensor = 400 };
await client.GetTable<Measure>().InsertAsync(measure);