2017-11-08 5 views
0

データベースファーストモデルのXamarinFormでAzureMobileClientをユーザーにしようとしました。今のところ私はオフライン同期を使用していません。 だから、私はAZURE SQL DBにテーブルを作成するには、このスクリプトを使用しますアズールによって提供されるサンプルTodoItemに基づいてAzureMobileClient DatabaseFirst手動でデータテーブルの作成に失敗しましたか?

CREATE TABLE [dbo].[TodoItems] (
-- This must be a string suitable for a GUID 
[Id]   NVARCHAR (128)  NOT NULL, 

-- These are the system properties 
[Version]  ROWVERSION   NOT NULL, 
[CreatedAt]  DATETIMEOFFSET (7) NOT NULL, 
[UpdatedAt]  DATETIMEOFFSET (7) NULL, 
[Deleted]  BIT    NOT NULL, 

-- These are the properties of our DTO not included in EntityFramework 
[Text]   NVARCHAR (MAX)  NULL, 
[Complete]  BIT    NOT NULL, 
); 

CREATE CLUSTERED INDEX [IX_CreatedAt] 
ON [dbo].TodoItems([CreatedAt] ASC); 

ALTER TABLE [dbo].[TodoItems] 
ADD CONSTRAINT [PK_dbo.TodoItems] PRIMARY KEY NONCLUSTERED ([Id] ASC); 

CREATE TRIGGER [TR_dbo_TodoItems_InsertUpdateDelete] ON [dbo].[TodoItems] 
AFTER INSERT, UPDATE, DELETE AS 
BEGIN 
    UPDATE [dbo].[TodoItems] 
     SET [dbo].[TodoItems].[UpdatedAt] = CONVERT(DATETIMEOFFSET, 
       SYSUTCDATETIME()) 
     FROM INSERTED WHERE inserted.[Id] = [dbo].[TodoItems].[Id] 
END; 

。バグなくGetAllItemsを実行できます(テーブルは現在空です)。しかし、私は私のAzureバックエンドでこのエラーを得た項目を挿入しようとすると:

{[Message, The operation failed with the following error: 'Cannot insert the value NULL into column 'CreatedAt', table 'TechCenterCentaur.dbo.TodoItems'; column does not allow nulls. INSERT fails.The statement has been terminated.'.]} 

は通常のAzureは、自動的にそのの世話をすることになっていますか?

私はちょうど私のXFコードであることを行う:

TodoItem cl = new TodoItem(); 
cl.Name = "Test"; 

await _todoTable.InsertAsync(cl); 

コールがうまくのみテストを含むTodoItemとバックエンドに作られ、他のすべてのフィールドがNULLであるされています。例外はバックエンドで発生しました:

public async Task<IHttpActionResult> PostTodoItem(TodoItem item) 
{ 
    try 
    { 
    TodoItem current = await InsertAsync(item); //crash here 
    return CreatedAtRoute("Tables", new { id = current.Id }, current); 
    } 
    catch (System.Exception e) 
    { 

    throw; 
    } 
} 

何か提案がありますか?

答えて

0

私は解決策を見つけました。問題は私のSQLテーブルにありました。 IDとCreatedDateの新しいGUIDの2つのALTER TABLEが欠落していました。

ここに私の新しいスクリプト:

USE [TechCenterCentaur] 
GO 

/****** Object: Table [dbo].[TodoItems] Script Date: 2017-11-08 11:09:14 
    ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[TodoItems](
    [Id] [nvarchar](128) NOT NULL, 
    [Text] [nvarchar](max) NULL, 
    [Complete] [bit] NOT NULL, 
    [Version] [timestamp] NOT NULL, 
    [CreatedAt] [datetimeoffset](7) NOT NULL, 
    [UpdatedAt] [datetimeoffset](7) NULL, 
    [Deleted] [bit] NOT NULL, 
CONSTRAINT [PK_dbo.TodoItems] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

GO 

ALTER TABLE [dbo].[TodoItems] ADD DEFAULT (newid()) FOR [Id] 
GO 

ALTER TABLE [dbo].[TodoItems] ADD DEFAULT (sysutcdatetime()) FOR 
     [CreatedAt] 
GO 

CREATE TRIGGER [TR_dbo_TodoItems_InsertUpdateDelete] ON [dbo].[TodoItems] 
AFTER INSERT, UPDATE, DELETE AS 
BEGIN 
    UPDATE [dbo].[TodoItems] 
     SET [dbo].[TodoItems].[UpdatedAt] = CONVERT(DATETIMEOFFSET, 
      SYSUTCDATETIME()) 
     FROM INSERTED WHERE inserted.[Id] = [dbo].[TodoItems].[Id] 
END; 
GO 
関連する問題