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

本文关键字:数据库 添加 默认 实体 框架 | 更新日期: 2023-09-27 18:30:04

我正在使用Entity Framework 创建MVC Azure mobile application service

我创建了一个类似的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这与我之前在这里问的一个问题的评论有关

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

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

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

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

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

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

我希望这能有所帮助!

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