C# 如何将默认实体框架列添加到现有数据库

C# 如何将默认实体框架列添加到现有数据库,c#,entity-framework,azure,azure-mobile-services,C#,Entity Framework,Azure,Azure Mobile Services,我正在使用实体框架创建一个MVC Azure移动应用程序服务 我创建了一个实体模型,如下所示: public class Regions : EntityData { public string Id { get; set; } public string Name { get; set; } } 我已经创建了一个TableController,因此我通过向以下对象发出get请求进行查询: http://localhost:3000/tables/Regions 这将返回一

我正在使用
实体框架创建一个
MVC Azure移动应用程序服务

我创建了一个
实体模型
,如下所示:

public class Regions : EntityData
{
    public string Id { get; set; }

    public string Name { get; set; }
}
我已经创建了一个TableController,因此我通过向以下对象发出get请求进行查询:

http://localhost:3000/tables/Regions
这将返回一个错误,说明:

“exceptionMessage”:“列名'Id'无效”。\r\n列名无效 'Version'。\r\n无效的列名'CreatedAt'。\r\n无效的列名'UpdatedAt'

输出中生成的查询是:

'SELECT 
     [Extent1].[Id] AS [Id], 
     [Extent1].[Name] AS [Name], 
     [Extent1].[Version] AS [Version], 
     [Extent1].[CreatedAt] AS [CreatedAt], 
     [Extent1].[UpdatedAt] AS [UpdatedAt], 
     [Extent1].[Deleted] AS [Deleted]
     FROM [dbo].[Region] AS [Extent1]''
因此,我的问题是如何将这些列添加到我已经存在的数据库中,以便我的
移动应用程序服务
能够正常工作


PS.这与我之前提出的一个问题有关

EntityData对象包含五个必填字段的定义:

[Id] [nvarchar](255) Default (CONVERT([nvarchar](255),newid(),(0))) NOT NULL  Primary Key,
[CreatedAt] [datetimeoffset](3) DEFAULT CONVERT([datetimeoffset](3),sysutcdatetime(),(0)) NOT NULL,
[UpdatedAt] [datetimeoffset](3)  DEFAULT CONVERT([datetimeoffset](3),sysutcdatetime(),(0)) NOT NULL,
[Version] [timestamp] NOT NULL,
[Deleted] [bit] DEFAULT 0 NULL,

您的id正在覆盖EntityData对象中的定义。此外,SQL数据库没有其他必填字段。我假设您没有进行迁移,因此数据库没有使用新定义进行更新。

EntityData对象包含五个必填字段的定义:

[Id] [nvarchar](255) Default (CONVERT([nvarchar](255),newid(),(0))) NOT NULL  Primary Key,
[CreatedAt] [datetimeoffset](3) DEFAULT CONVERT([datetimeoffset](3),sysutcdatetime(),(0)) NOT NULL,
[UpdatedAt] [datetimeoffset](3)  DEFAULT CONVERT([datetimeoffset](3),sysutcdatetime(),(0)) NOT NULL,
[Version] [timestamp] NOT NULL,
[Deleted] [bit] DEFAULT 0 NULL,

您的id正在覆盖EntityData对象中的定义。此外,SQL数据库没有其他必填字段。我假设您没有进行迁移,因此数据库没有使用新定义进行更新。

如果这是针对一项新服务,您没有使用现有数据库,则创建表及其列(不仅是默认的移动应用程序列,还包括在更改时支持您定义的模型的列)应该像使用正确的EF数据库初始化策略一样简单

您会注意到,您的服务模板为您创建了一个数据库初始值设定项,通常名为
MobileServiceInitializer
,它可能继承自
CreateDatabaseIfNotExists

在开发过程中,将初始值设定项使用的基类更改为
DropCreateDatabaseIfModelChanges
DropCreateDatabaseAlways
(这将完全按照名称所述执行)将自动更改数据库以匹配您定义的模型(包括默认列)

这将在开发时满足您的需要,但正如前面提到的,更长期的解决方案是采用EF迁移。您可以在此处了解更多信息:

另外,正如Adrian所提到的,您的Region类正在定义一个Id属性,该属性隐藏了EntityData提供的实现,可能会导致问题,因此建议删除它


我希望这有帮助

如果这是针对一个新的服务,您不使用现有数据库,那么创建表及其列(不仅是默认的Mobile Apps列,还包括在更改模型时支持您定义的模型的列)应该与使用正确的EF数据库初始化策略一样简单

您会注意到,您的服务模板为您创建了一个数据库初始值设定项,通常名为
MobileServiceInitializer
,它可能继承自
CreateDatabaseIfNotExists

在开发过程中,将初始值设定项使用的基类更改为
DropCreateDatabaseIfModelChanges
DropCreateDatabaseAlways
(这将完全按照名称所述执行)将自动更改数据库以匹配您定义的模型(包括默认列)

这将在开发时满足您的需要,但正如前面提到的,更长期的解决方案是采用EF迁移。您可以在此处了解更多信息:

另外,正如Adrian所提到的,您的Region类正在定义一个Id属性,该属性隐藏了EntityData提供的实现,可能会导致问题,因此建议删除它


我希望这有帮助

你试过使用迁移吗?@FabioLuz我不确定迁移是什么?你有我能读到的链接吗?试试这些:你试过使用迁移吗?@FabioLuz我不知道迁移是什么?你有我可以读到的链接吗?试试这些:谢谢你的回复。我会阅读你发布的链接。我猜
DropCreateDatabase
将删除数据库中的现有数据。我将进一步研究
迁移
,看看是否能找到我需要的是的,你的猜测是正确的。DropCreateDatabaseX将删除数据。当您最初定义模型并在本地开发服务时,这不应该是一个问题,但绝对不是针对生产数据库(或您关心的任何数据库)运行时推荐的问题。感谢您的回复。我会阅读你发布的链接。我猜
DropCreateDatabase
将删除数据库中的现有数据。我将进一步研究
迁移
,看看是否能找到我需要的是的,你的猜测是正确的。DropCreateDatabaseX将删除数据。当您最初定义模型并在本地开发服务时,这不应该是一个问题,但绝对不是针对生产数据库(或您关心的任何数据库)运行时推荐的问题。