entity-framework - 使用 OData v4、EF6 和 Web API v2.2 处理日期

标签 entity-framework asp.net-web-api odata asp.net-web-api2

我正在从 v1-3 升级到 v4,但遇到了一些问题。

我的理解是 DateTime 不受支持,我必须始终使用 DateTimeOffset。美好的。

但在我存储 Sql date 之前DateTime 中的数据类型,现在看来我收到此错误:

Member Mapping specified is not valid. The type 'Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]' of member 'CreatedDate' in type 'MyEntity' is not compatible with 'SqlServer.date[Nullable=False,DefaultValue=,Precision=0]'

解决这个问题的方法是什么?我需要能够在数据库中专门存储日期(时间和地点并不重要)。如果我能得到 Edm.Date 以及返回的数据类型,那就太好了,但我以前没有。

谢谢。

编辑:示例类

前:
public class Ticket
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required, MaxLength(50)]
    public string Reference { get; set; }

    [Column(TypeName = "date")]
    public DateTime LoggedDate { get; set; }
}

后:
public class Ticket
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required, MaxLength(50)]
    public string Reference { get; set; }

    [Column(TypeName = "date")]
    public DateTimeOffset LoggedDate { get; set; }
}

这在 EF 中无效。

最佳答案

一种选择是在实体中定义新属性。说 Title 映射到 EF:

public partial class Title
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Nullable<System.DateTime> CreatedOn { get; set; }
}

然后添加一个新的 DateTimeOffset 属性:
public partial class Title
{
    [NotMapped]
    public DateTimeOffset? EdmCreatedOn
    {
        // Assume the CreateOn property stores UTC time.
        get
        {
            return CreatedOn.HasValue ? new DateTimeOffset(CreatedOn.Value, TimeSpan.FromHours(0)) : (DateTimeOffset?)null;
        }
        set
        {
            CreatedOn = value.HasValue ? value.Value.UtcDateTime : (DateTime?)null;
        }
    }
}

生成 OData 模型的代码如下所示:
    public static IEdmModel GetModel()
    {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        EntityTypeConfiguration<Title> titleType= builder.EntityType<Title>();
        titleType.Ignore(t => t.CreatedOn);
        titleType.Property(t => t.EdmCreatedOn).Name = "CreatedOn";

        builder.EntitySet<Title>("Titles");

        builder.Namespace = typeof(Title).Namespace;

        return builder.GetEdmModel();
    }
}

Controller 看起来像:
public class TitlesController : ODataController
{
    CustomerManagementSystemEntities entities = new CustomerManagementSystemEntities();

    [EnableQuery(PageSize = 10, MaxExpansionDepth = 5)]
    public IHttpActionResult Get()
    {
        IQueryable<Title> titles = entities.Titles;
        return Ok(titles);
    }

    public IHttpActionResult Post(Title title)
    {
        entities.Titles.Add(title);
        return Created(title);
    }
}

关于entity-framework - 使用 OData v4、EF6 和 Web API v2.2 处理日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24829422/

相关文章:

c# - 尽管拥有正确的 NuGet 包,为什么我仍然需要在计算机上安装 MySQL 连接器?

c# - 如何在不清理请求的情况下从请求中获取主体值(Stream)?

asp.net-web-api - OData V4修改服务器端$filter

entity-framework - 带有 Entity Framework 的 ASP Web API Controller 非常缓慢和奇怪的结果

web-services - OData 和 REST Web 服务之间的区别

c# - 如何按 OData 中的嵌套属性进行过滤?

asp.net-mvc - 将多个项目解决方案部署到azure

.net - ADO.NET Entity Framework 和标识列

entity-framework - EF5 Code First 迁移 - DB Init 一遍又一遍地运行

ajax - 使用 ajaxSetup beforeSend 进行基本身份验证会破坏 SignalR 连接