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

时间:2016-01-13 14:32:20

标签: c# entity-framework azure azure-mobile-services

我正在使用MVC Azure mobile application service

创建Entity Framework

我创建了Entity Model,如此:

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无效的列名称   '版本'。\ 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]''

所以我的问题是如何将这些列添加到我现有的数据库中,以便我的mobile app service能够正常工作?

PS。这与我之前提出的here

问题的评论相关联

2 个答案:

答案 0 :(得分:2)

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数据库没有其他必需字段。我假设您没有进行迁移,因此数据库没有使用新定义进行更新。

答案 1 :(得分:2)

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

您会注意到您的服务模板已为您创建了一个数据库初始值设定项,通常名为MobileServiceInitializer,可以从CreateDatabaseIfNotExists<MobileServiceContext>继承。

在开发过程中,将初始化程序使用的基类更改为DropCreateDatabaseIfModelChanges<MobileServiceContext>DropCreateDatabaseAlways<MobileServiceContext>(这将完全符合名称所示)将自动更改数据库以匹配您定义的模型(包括默认列。)

这应该会在开发过程中为您提供所需的内容,但如前所述,更长远的解决方案是采用EF迁移。您可以在此处了解详情:http://msdn.microsoft.com/en-us/data/jj591621.aspx

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

我希望这有帮助!

相关问题