AzureMobileClient DatabaseFirst 手动创建数据表失败?

AzureMobileClient DatabaseFirst manually create datatable fail?

我尝试使用数据库优先模型在我的 XamarinForm 中使用 AzureMobileClient。现在我不使用离线同步。 所以我使用这个脚本在我的 AZURE SQL DB:

中创建 table
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;

基于 Azure 提供的示例 TodoItem。我可以执行 GetAllItems 而不会出现任何错误(table 目前为空)。但是当我尝试插入一个项目时,我的 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);

使用仅包含 Test 且所有其他字段均为空的 TodoItem 对后端进行了很好的调用。后端发生异常:

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;
  }
}

有什么建议吗?

好的,我找到了解决方案。问题出在我的 SQL table 中。我错过了 ID 的新 GUID 和 CreatedDate 的 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