【问题标题】:How do I ignore default EntityData properties?如何忽略默认的 EntityData 属性?
【发布时间】:2016-01-11 13:56:34
【问题描述】:

我正在使用Entity Framework 创建一个MVC 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无效的列名 >'Version'。\r\n无效的列名 'CreatedAt'。\r\n无效的列 名称 'UpdatedAt'。",

查看EntityData 类,我可以看到这些是EntityData 类的属性:

public abstract class EntityData : ITableData
{
    protected EntityData();

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Index(IsClustered = true)]
    [TableColumn(TableColumnType.CreatedAt)]
    public DateTimeOffset? CreatedAt { get; set; }
    [TableColumn(TableColumnType.Deleted)]
    public bool Deleted { get; set; }
    [Key]
    [TableColumn(TableColumnType.Id)]
    public string Id { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    [TableColumn(TableColumnType.UpdatedAt)]
    public DateTimeOffset? UpdatedAt { get; set; }
    [TableColumn(TableColumnType.Version)]
    [Timestamp]
    public byte[] Version { get; set; }
}

所以生成的查询是

'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]''

这显然是查询失败的原因。

是否可以排除这些默认的EntityData 列,因为它们不在我的表中Regions

【问题讨论】:

  • 请务必注意,ITableData 提供的字段是支持 Azure 移动客户端 SDK 所必需的。版本用于支持 ETag。 UpdatedAt & Version 用于支持离线同步功能,Deleted 用于支持多客户端离线同步场景中的软删除功能。如果删除这些字段,则无法使用 Azure 移动客户端 SDK。将服务设置为使用“动态架构”将为您将字段重新添加到您的数据库中。
  • @AdrianHall 感谢您的评论。我实际上正在使用 Azure 移动客户端 SDK。所以你提到它是一件非常好的事情。我将如何设置服务以使用Dynamic Schema

标签: c# asp.net asp.net-mvc entity-framework azure-mobile-services


【解决方案1】:

首先你需要用新键隐藏基类属性:

public new DateTimeOffset? CreatedAt { get; set; }

然后添加属性[NotMapped]:

[NotMapped]
public new DateTimeOffset? CreatedAt { get; set; }

最终结果:

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

    public string Name { get; set; }

    [NotMapped]
    public new DateTimeOffset? CreatedAt { get; set; }

    [NotMapped]
    public new DateTimeOffset? UpdatedAt { get; set; }

    [NotMapped]
    public new byte[] Version { get; set; }
}

我不知道在这种情况下你想如何对待 id。如果需要隐藏基类属性,请在 type 之前添加 new。

【讨论】:

  • 只是为了澄清我会隐藏基类属性并将其标记为[NotMapped] 你能用我的Regions 类隐藏属性做一个简单的例子吗?
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 2018-06-07
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
相关资源
最近更新 更多